亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

相互引用類死鎖

相互引用類死鎖

牧羊人nacy 2022-05-11 16:32:06
我有兩個相互引用的 SQLAlchemy 類聲明,所以第一個給出錯誤,因為第二個尚未聲明。Keywith中的記錄key_type_id == 4是從一個Entity人Entity通過parent_entity_id.要定義Entity收集所有子實體的關系,我需要添加一個反向引用,但該引用key稍后聲明。class Entity(db.Model):    __tablename__ = 'entity'    entity_id = db.Column(db.INTEGER, primary_key=True)    ...    children = db.relationship(        'Entity', secondary=key,        primaryjoin="and_(key.c.entity_id == entity_id, "            "key.c.key_type_id == 4)",        secondaryjoin=(key.c.parent_entity_id == entity_id),        backref=db.backref('key', lazy='dynamic'), lazy='dynamic')class Key(db.Model):    __tablename__ = 'key'    ...    entity_id = db.Column(db.ForeignKey('entity.entity_id'), nullable=False,         index=True)    ...    key_type_id = db.Column(db.ForeignKey('key_type.key_type_id'), index=True)         # 4 for a foreign key    ...    parent_entity_id = db.Column(db.INTEGER, index=True)    ...錯誤回溯是。ipdb> Traceback (most recent call last):  File "<ipython-input-1-a3063c2d9856>", line 1, in <module>    debugfile('C:/Users/Mark Kortink/Dropbox/Python/projects/metapplica/_dev/Scraps/ooClass2DBs.py', wdir='C:/Users/Mark Kortink/Dropbox/Python/projects/metapplica/_dev/Scraps')  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 856, in debugfile    debugger.run("runfile(%r, args=%r, wdir=%r)" % (filename, args, wdir))  File "C:\ProgramData\Anaconda3\lib\bdb.py", line 585, in run    exec(cmd, globals, locals)  File "<string>", line 1, in <module>  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile    execfile(filename, namespace)  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile    exec(compile(f.read(), filename, 'exec'), namespace)首先,我是否正確聲明了 backref 關系?二、如何打破僵局?
查看完整描述

1 回答

?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

key您正在使用的模塊中不存在該名稱。即使您Key首先定義了您的類,實際上也永遠不會引用在您的模塊范圍內Table命名的對象。key認識到這一點,您可以將表的名稱作為字符串傳遞給它的參數relationship(),否則需要在模塊范圍內引用該名稱。

文檔

使用聲明式擴展時,聲明式初始化程序允許將字符串參數傳遞給 relationship()。這些字符串參數被轉換為可調用函數,將字符串評估為 Python 代碼,使用聲明性類注冊表作為命名空間。這允許通過其字符串名稱自動查找相關類,并且無需在聲明依賴類之前將相關類導入本地模塊空間。

也就是說secondary=key,可以聲明為secondary="key"。然后,SQLAlchemy 將僅"key"在映射所有類之后嘗試將字符串解析為它引用的對象,并且該表將存在于 SQLAlchemy 用于跟蹤此類對象的內部注冊表中。同樣,secondaryjoin=(key.c.parent_entity_id == entity_id)可以定義為secondaryjoin="key.c.parent_entity_id == entity_id"。


查看完整回答
反對 回復 2022-05-11
  • 1 回答
  • 0 關注
  • 212 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號