我在Postgre DB中有两个简单的表: 与用户和角色具有多对一的关系,后面带有以下代码:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True, nullable=False)
created = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now)
username = db.Column(db.String(80), unique=True, nullable=False)
password = db.Column(db.String(256), unique=False, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=True)
active = db.Column(db.Boolean, nullable=False, default=True)
role_id = db.Column(db.Integer, db.ForeignKey('role.id', ondelete='SET DEFAULT'), server_default = '1', nullable = False)
role = db.relationship('Role', backref = db.backref('users', lazy = True), passive_deletes = True)
还有
class Role(db.Model):
id = db.Column(db.Integer, primary_key=True, nullable=False)
slug = db.Column(db.String, nullable=False)
对DB的ON DELETE SET DEFAULT约束正确运行,但是SA在删除之前强制将Role_id的NULL更新,从而提高完整性错误。
2018-09-25 14:08:54,922 INFO sqlalchemy.engine.base.Engine UPDATE "user" SET role_id=%(role_id)s WHERE "user".id = %(user_id)s
2018-09-25 14:08:54,922 INFO sqlalchemy.engine.base.Engine {'role_id': None, 'user_id': 2}
我尝试了级联选项和Passive_deletes无效。正确的方法应该是什么?
答案 0 :(得分:0)
passive_deletes = 'all'
做这项工作,但是关系声明的顺序很重要,因此 删除了 User 中的 role 声明并在 Role 中创建了相反的 users 关系。现在,SA完全根据数据库设置进行中继。
users = db.relationship('User', backref = db.backref('role', lazy = True), passive_deletes = "all")
在角色类中。