2017-09-18 90 views
1

我一直在努力了一段時間了,並沒有找到答案,或者我已經看到了答案,只是沒有得到它 - 但是,我希望我能夠描述我的問題。sqlalchemy映射表從mssql數據庫與「前綴命名空間」

我有一個MS SQL數據庫,在這個數據庫中,表被分組到命名空間(或任何它被稱爲)中,由Prefix.Tablename(帶點)表示。因此,請求一些內容的原生SQL語句如下所示:

SELECT TOP 100 
    [Value], [ValueDate] 
    FROM [FinancialDataBase].[Reporting].[IndexedElements] 

如何將此映射到sqlalchemy? 如果「報告」前綴不會在那裏,該溶液(或做這件事)是這樣的:

from sqlalchemy import * 
from sqlalchemy.ext.declarative import declarative_base, declared_attr 
from sqlalchemy.orm import sessionmaker 

def get_session(): 
    from urllib.parse import quote_plus as urllib_quote_plus 

    server = "FinancialDataBase.sql.local" 
    connstr = "DRIVER={SQL Server};SERVER=%s;DATABASE=FinancialDataBase" % server 
    params = urllib_quote_plus(connstr) 
    base_url = "mssql+pyodbc:///?odbc_connect=%s" % params 

    engine = create_engine(base_url,echo=True) 
    Session = sessionmaker(bind=engine) 
    session = Session() 

    return engine, session 

Base = declarative_base() 

class IndexedElements(Base): 
    __tablename__ = "IndexedElements" 

    UniqueID = Column(String,primary_key=True) 
    ValueDate = Column(DateTime) 
    Value = Column(Float) 

,然後請求可以做,幷包裹在一個熊貓數據幀例如是這樣的:

import pandas as pd 

engine, session = get_session() 

query = session.query(IndexedElements.Value,IndexedElements.ValueDate) 

data = pd.read_sql(query.statement,query.session.bind) 

但是,編譯和實際執行這個SQL語句,包括這種錯誤FROM部分:

FROM [FinancialDataBase].[IndexedElements] 

由於命名空間前綴它禾ULD必須

FROM [FinancialDataBase].[Reporting].[IndexedElements] 

簡單的表名擴大到

__tablename__ = "Reporting.IndexedElements" 

犯規修復它,因爲它改變了編譯的SQL語句

FROM [FinancialDataBase].[Reporting.IndexedElements] 

其正常不工作。

那麼這怎麼解決呢?

+0

您正在尋找的術語是[模式](https://technet.microsoft.com/zh-cn/library/dd283095(v = sql。 100)的.aspx)。 SQLAlchemy支持將[元數據](http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.MetaData.params.schema)中的架構作爲要使用的默認架構,並且[每個表](http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.params.schema)。使用Declarative,您應該在['__table_args__'](http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/table_config.html#table-configuration)中傳遞每個表模式。 –

+0

非常多相關:https://stackoverflow.com/questions/30538132/sqlalchemy-declarative-schemas-in-sql-server-and-foreign-primary-keys –

+0

謝謝Ilja,「模式」釘了它!我將創建一個答案,提及您的評論! – joaquinn

回答

2

答案在評論鑑於上述ILJA:

的「命名空間」是所謂的模式,並已在映射對象被declarated。鑑於從開口後的例子中,映射表必須被這樣定義:

class IndexedElements(Base): 
    __tablename__ = "IndexedElements" 
    __table_args__ = {"schema": "Reporting"} 

    UniqueID = Column(String,primary_key=True) 
    ValueDate = Column(DateTime) 
    Value = Column(Float) 

或定義包含這些信息對於不同的圖式的基類。在sqlalchemy文檔中檢查「增加基數」: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/mixins.html#augmenting-the-base