python - 来自 mssql 数据库的 sqlalchemy 映射表,值为 "prefix-namespaces"

标签 python sql sql-server orm sqlalchemy

我已经为此苦苦挣扎了一段时间,但还没有找到答案,或者也许我已经看到了答案,只是没有得到它 - 但是,我希望我能够描述我的问题。

我有一个 MS SQL 数据库,其中的表按命名空间(或任何名称)分组,由 Prefix.Tablename(带点)表示。因此,请求某些内容的 native sql 语句如下所示:

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

如何将其映射到 sqlalchemy? 如果“Reporting”前缀不存在,解决方案(或一种方法)如下所示:

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]

由于 namespace 前缀,它必须是

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

只需将表名称扩展为

__tablename__ = "Reporting.IndexedElements"

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

FROM [FinancialDataBase].[Reporting.IndexedElements]

无法正常工作。

那么如何解决这个问题呢?

最佳答案

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

“命名空间”是所谓的模式,必须在映射对象中声明。鉴于开头文章中的示例,映射表必须如下定义:

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

关于python - 来自 mssql 数据库的 sqlalchemy 映射表,值为 "prefix-namespaces",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46277437/

相关文章:

sql - 返回具有已知前缀和后缀字符的 SUBSTRING

python - 为什么不为 "in"操作设置文字 O(1)?

sql - 您会考虑使用 MS SQL Server Management Studio 的替代方案吗?

sql - 基于多个字段的完整外部联接

sql-server - 将 Postman 与 SQL Server Management Studio 集成

sql - 截断 SQL varchar 列

python - 返回 csv 文件作为响应,其中仅包含标题

python - 在预处理和降维之前还是之后将 X 拆分为测试/训练?机器学习

python - OOP 和线程子类

sql - Group By 语句作为列