来自mssql数据库的sqlalchemy映射表,带有“prefix-namespaces”

时间:2017-09-18 10:49:14

标签: python sql sql-server orm sqlalchemy

我已经在这方面挣扎了一段时间并且还没有找到答案,或者我已经看过答案并且没有得到它 - 但是,我希望我能够描述我的问题。

我有一个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)

然后可以完成请求并将其包装在Pandas数据框中,例如:

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]

由于名称空间前缀,它必须是

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

只需将表名扩展为

即可
__tablename__ = "Reporting.IndexedElements"

没有修复它,因为它将已编译的sql语句更改为

FROM [FinancialDataBase].[Reporting.IndexedElements]

无效。

那怎么能解决呢?

1 个答案:

答案 0 :(得分:3)

上面的Ilja的评论给出了答案:

"命名空间"是一个所谓的模式,必须在映射的对象中声明。给出开头帖子的例子,映射表必须像这样定义:

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

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

或者为不同的schemata定义包含这些信息的基类。检查"扩充基地"在sqlalchemy文档中: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/mixins.html#augmenting-the-base