これはしばらくの間苦労していましたが、まだ答えが見つからなかったか、またはすでに答えを見たことがありませんでした。私が私の問題を説明できることを願っています。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する必要があります
:
あなたが探している用語は、[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)に渡す必要があります。 –
非常に関連している:https://stackoverflow.com/questions/30538132/sqlalchemy-declarative-schemas-in-sql-server-and-foreign-primary-keys –
ありがとうIlja、 "スキーマ"はそれを釘付け!私はあなたのコメントを参照して答えを作成します! – joaquinn