我的 Flask/SQLAlchemy 应用程序中有以下四个模型类(MyClassA
此处未显示第五个类,但作为参考):
class MyClassF(db.Model):
valid_fs = ['F1', 'F2']
f_id = db.Column(db.Integer, nullable=False, primary_key=True)
name = db.Column(db.Enum(*valid_fs, name='f_enum'), default='F1', nullable=False)
class MyClassD(db.Model):
d_id = db.Column(db.Integer, nullable=False, primary_key=True)
name = db.Column(db.String(128))
v_collection = db.relationship('MyClassV', lazy='dynamic', backref=db.backref('d'), cascade='all, delete-orphan')
class MyClassV(db.Model):
v_id = db.Column(db.Integer, nullable=False, primary_key=True)
d_id = db.Column(db.Integer, db.ForeignKey(MyClassD.d_id), nullable=False)
c_collection = db.relationship('MyClassC', lazy='dynamic', backref=db.backref('v'), cascade='all, delete-orphan')
a_collection = db.relationship('MyClassA', lazy='dynamic', backref=db.backref('v'), cascade='all, delete-orphan')
class MyClassC(db.Model):
c_id = db.Column(db.Integer, nullable=False, primary_key=True)
v_id = db.Column(db.Integer, db.ForeignKey(MyClassV.v_id), nullable=False)
f_id = db.Column(
db.Integer,
db.ForeignKey(MyClassF.f_id),
nullable=False,
#default=MyClassF.query.filter(MyClassF.name == "F1").one().f_id
)
使用Flask-Migrate命令创建此模式db init
,db migrate
并且db upgrade
工作正常。
但是,当我取消注释定义的行MyClassC.f_id
并再次尝试(删除migrations
目录后)时,我收到以下循环依赖错误:
sqlalchemy.exc.InvalidRequestError:初始化映射器 Mapper|MyClassV|my_classV 时,表达式 'MyClassC' 未能找到名称(“名称 'MyClassC' 未定义”)。如果这是一个类名,请考虑在定义了两个依赖类之后将此 relationship() 添加到该类中。
我要做的就是确保MyClassC.f_id
通过查询MyClassF
表来设置默认值。该检查应该在插入时进行——而不是在创建数据库时。所以我不明白为什么我现在收到这个错误。
db.relationship()
在执行我试图实现的数据库完整性规则时,如何使用(或任何其他技术)来解决这个循环依赖错误?