簡體   English   中英

sqlalchemy表架構自動加載

[英]sqlalchemy table schema autoload

我正在創建一個像這樣的SQL煉金術表:

myEngine = self.get_my_engine() # creates engine
metadata = MetaData(bind=myEngine)
SnapshotTable = Table("mytable", metadata, autoload=False, schema="my schema")

我必須使用自動加載假,因為表可能存在或可能不存在(並且該代碼必須在創建表之前運行)

問題是,如果我使用autoload = False,當我嘗試查詢表(在由另一個進程創建之后)執行session.query(SnapshotTable)我得到一個:

InvalidRequestError: Query contains no columns with which to SELECT from.

錯誤; 這是可以理解的,因為該表尚未加載。

我的問題是:如何在使用autoload = False定義表元數據后“加載”表元數據。

我查看了schema.py代碼,似乎我可以這樣做:

SnapshotTable._autoload(metadata, None, None)

但這對我來說並不合適......任何其他想法或想法?

謝謝

首先聲明表模型:

class MyTable(Base):
    __table__ = Table('mytable', metadata)

或直接:

MyTable = Table("mytable", metadata)

然后,一旦准備加載它,請調用:

Table('mytable', metadata, autoload_with=engine, extend_existing=True)

其中的關鍵是extend_existing = True

所有功勞都歸功於SQLAlchemy郵件列表中的Mike Bayer。

我想這個問題是沒有反映元數據。 您可以嘗試使用此調用bevore執行任何查詢的方法加載元數據:

metadata.reflect() 

它將重新加載表的定義,因此框架將知道如何構建適當的SELECT 然后打電話

if SnapshotTable.exists :
     SnapshotTable._init_existing()

我昨晚正在處理這個問題,事實證明,你需要做的就是在metadat.reflect的幫助下從數據庫中加載所有可用的表定義。 這與@ fgblomqvist的解決方案非常相似。 主要區別在於您不必重新創建表。 實質上,以下內容應該有所幫助:

SnapshotTable.metadata.reflect(extend_existing=True, only=['mytable'])

這里的無名英雄是extend_existing參數。 它基本上確保重新加載與SnapshotTable相關的模式和其他信息。 此處only使用該參數來限制檢索的信息量。 如果您正在處理大型數據庫,這將為您節省大量時間

我希望這在未來有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM