[英]Flask-SqlAlchemy relationship error
這是我有的簡單模型
class Record(db.Model):
__tablename__ = 'reg_records'
request_id = db.Column(db.Integer, primary_key = True)
title = db.Column(NVARCHAR())
class Field(db.Model):
__tablename__ = 'reg_fields'
request_id = db.Column(db.Integer, primary_key= True)
name = db.Column(NVARCHAR(), primary_key = True)
現在,我想映射相關的字段進行記錄。 我正在遵循flask-sqlalchemy規格並獲取此
class Field(db.Model):
__tablename__ = 'reg_fields'
request_id = db.Column(db.Integer, ForeignKey('record.request_id'), primary_key= True)
name = db.Column(NVARCHAR(), primary_key = True)
class Record(db.Model):
__tablename__ = 'reg_records'
request_id = db.Column(db.Integer, primary_key = True)
title = db.Column(NVARCHAR())
fields = db.relationship(Field, backref = 'record')
但是,當我嘗試使用此模型時,出現以下錯誤
sqlalchemy.exc.NoForeignKeysError
NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Record.fields - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.
將primaryjoin
添加到關系聲明中,如下所示
fields = db.relationship(Field, backref = 'record', primaryjoin='Record.request_id==Field.request_id')
無法解決問題,而是給出了新的例外
sqlalchemy.exc.NoReferencedTableError
NoReferencedTableError: Foreign key associated with column 'reg_fields.request_id' could not find table 'record' with which to generate a foreign key to target column 'request_id'
如果我將類名替換為primaryjoin值中的表名,
fields = db.relationship(Field, backref = 'record', primaryjoin='reg_records.request_id==reg_fields.request_id')
我又遇到另一個例外
sqlalchemy.exc.InvalidRequestError
InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Original exception was: 'Table' object has no attribute 'request_id'
總體而言,在flask-sqlalchemy中建立一對多關系的正確方法是什么。
目前尚不清楚您要做什么。 我假設您正在嘗試在記錄和字段之間建立一對多關系(一個記錄可以有零個或多個字段)。 我還假設您希望每個記錄僅具有一個名為name的字段。 我認為您希望使用以下模型來設置表和關系:
from sqlalchemy.schema import UniqueConstraint
class Record(db.Model):
__tablename__ = 'reg_records'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(NVARCHAR())
class Field(db.Model):
__tablename__ = 'reg_fields'
__table_args__ = (
UniqueConstraint('record_id', 'name', name='record_id_name_uix'),
)
id = db.Column(db.Integer, primary_key=True)
record_id = db.Column(db.Integer, ForeignKey(Record.id))
name = db.Column(NVARCHAR())
record = db.relationship(Record, backref='fields')
現在,您可以執行諸如創建新的記錄和字段的操作:
record = Record(title='a record')
record.fields.append(Field(name='field1'))
record.fields.append(Field(name='field2'))
db.session.add(record)
db.session.commit()
但是,嘗試為同一條記錄創建兩個具有相同名稱的字段,嘗試提交它們時會收到IntegrityError:
record = Record(title='another record')
record.fields.append(Field(name='same_name'))
record.fields.append(Field(name='same_name'))
db.session.add(record)
db.session.commit()
最后,請嘗試更加謹慎地設置Python代碼的格式,很難理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.