【发布时间】:2016-08-05 15:20:11
【问题描述】:
我在 Flask 中遇到外键问题。 我的模型如下:
Model.py
class User(db.Model):
__tablename__ = "users"
__table_args__ = {'extend_existing': True}
user_id = db.Column(db.BigInteger, primary_key=True)
# EDIT
alerts = db.relationship('Alert', backref='user', lazy='dynamic')
def __init__(self, user_id):
self.user_id = user_id
class Alert(db.Model):
__tablename__ = 'alert'
__table_args__ = {'extend_existing': True}
alert_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
user_id = db.Column(db.BigInteger, db.ForeignKey('users.user_id'), nullable=False)
name = db.Column(db.String(ALERT_NAME_MAX_SIZE), nullable=False)
def __init__(self, user_id, name):
self.user_id = user_id
self.name = name
我可以添加一些用户,例如
a = User(16)
b = User(17)
db.session.add(a)
db.session.add(b)
db.session.commit()
还有一些提醒:
c = Alert(16, 'test')
d = Alert(17, 'name_test')
db.session.add(c)
db.session.add(d)
db.session.commit()
外键有两个问题: 首先,当我尝试修改 user_id 警报时,即使 user_id 不在数据库中,我也可以这样做
alert = Alert.query.get(1)
alert.user_id = 1222 # not in the database
db.session.commit()
并且我可以使用不在数据库中的 user_id 创建警报:
r = Alert(16223, 'test')
db.session.add(r)
我不明白为什么他们没有关系约束。 谢谢,
【问题讨论】:
-
你在使用 sqlite 吗?
-
我正在使用 SQLAlchemy
-
是的,我可以看到,但是你的数据库是什么? SQLite 默认不强制使用外键,您必须使用特定的配置才能使其与 SQLAlchemy 一起使用。
-
是的,但我没有找到关于它的好文档(或教程)
-
我尝试使用 db.ForeignKeyConstraint(在我的代码中编辑)但没有改变
标签: python flask foreign-keys flask-sqlalchemy