我是新來的SQLAlchemy(奧姆斯在通常情況下),我試圖在移動現有的應用程序SQLAlchemy的,這樣我們就可以從現有(和繁瑣的更新)查詢轉移一些代碼的複雜性,到Python。不幸的是,我在數據庫反射後立即出現錯誤。雖然我可以直接查詢表,但我實際上沒有直接訪問類或類之間的關係。下面是我正在嘗試做的一個大約最小的例子。SQLAlchemy的自動映射backref錯誤
現存的Postgres數據表:
dev=> \d+ gmt_file
Table "public.gmt_file"
Column | Type | Modifiers | Storage | Stats target | Description
-----------+--------------+-----------+----------+--------------+-------------
file_id | integer | not null | plain | |
a | integer | | plain | |
b | integer | | plain | |
Indexes:
"gmt_file_pk" PRIMARY KEY, btree (file_id)
Foreign-key constraints:
"gmt_file_a_fk" FOREIGN KEY (a) REFERENCES cmn_user(user_id)
"gmt_file_b_fk" FOREIGN KEY (b) REFERENCES cmn_user(user_id)
SQLAlchemy的應用程序(小例子):
from sqlalchemy import create_engine
from sqlalchemy.orm import Session,Mapper
from sqlalchemy.ext.automap import automap_base
engine = create_engine('postgresql://user:[email protected]:5432/dev')
Base = automap_base()
Base.prepare(engine, reflect=True)
session = Session(engine,autocommit=True)
session.query(Base.classes.gmt_file).all()
從我目前可以告訴,這將引發因爲兩者a
和b
具有一個backref錯誤與不同表中的相同字段的外鍵關係(這通常發生在現有數據庫中)。我嘗試了多種處理此錯誤的方法,包括創建自定義命名函數(name_for_scalar_relationship()
和name_for_collection_relationship()
),但無濟於事。有沒有一種標準的方法來處理這個問題,或者在SQLAlchemy中禁用反射過程中的backref創建?
的最終目標將是反映以自動化的方式分貝,而不必編寫自定義名稱爲數百個目前存在表的映射,但是我在適合做什麼損失。任何幫助表示讚賞。
謝謝
我不確定這是否有助於找到解決方案,但我可以直接使用'__table__'子對象查詢表。例如。 'session.query(Base.classes.gmt_file .__ table __)。all()'不會引發錯誤。有什麼想法嗎? – DavidWayne