2017-09-18 1 views
1

これはしばらくの間苦労していましたが、まだ答えが見つからなかったか、またはすでに答えを見たことがありませんでした。私が私の問題を説明できることを願っています。sqlalchemy "prefix-namespaces"を使用したmssqlデータベースのマップテーブル

テーブルが名前空間(または呼び出されるもの)にグループ化され、Prefix.Tablename(ドット付き)で表されるMS SQLデータベースがあります。だから、いくつかのコンテンツを要求するネイティブ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] 

により、それはヲ名前空間接頭辞へそれが適切に仕事をdoesntの

FROM [FinancialDataBase].[Reporting.IndexedElements] 

にコンパイルされたSQL文が変更されるためULDは、単にそれを修正doesntの

__tablename__ = "Reporting.IndexedElements" 

にテーブル名を展開し

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

でなければなりません。

これはどのように解決できますか? 「名前空間」とは、いわゆるスキーマで、マップされたオブジェクトにdeclaratedする必要があります

+0

あなたが探している用語は、[schema](https://technet.microsoft.com/en-us/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によって、コメントに記載されています。

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

関連する問題