【发布时间】:2016-11-07 08:06:39
【问题描述】:
我的 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'”)。如果这是一个类名, 考虑将此关系()添加到 在定义了两个依赖类之后的类。
我要做的就是确保通过查询MyClassF 表来设置MyClassC.f_id 的默认值。此检查应在插入时进行——而不是在创建数据库时。所以我不明白为什么我现在收到这个错误。
我如何使用db.relationship()(或任何其他技术)来解决这个循环依赖错误,同时执行我正在尝试实施的数据库完整性规则?
【问题讨论】:
标签: python sqlalchemy flask-sqlalchemy circular-dependency flask-migrate