我对SQLAlchemy中的外键定义有一个好奇的问题。
我有一对多的关系,这是我的示范站点。
class Site(db.Model):
__tablename__ = "site"
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(), nullable=False)
address = db.Column(db.String(), nullable=False)
city = db.Column(db.String())
state = db.Column(db.String())
latitude = db.Column(db.Float(), nullable=False)
longitude = db.Column(db.Float(), nullable=False)
site_type = db.Column(db.String())
stations = relationship('Station', backref='site')
def __init__(self, **kwargs):
super(Site, self).__init__(**kwargs)
class Station(db.Model):
__tablename__ = "station"
id = db.Column(db.Integer(), primary_key=True)
site_id = db.Column(db.Integer(), ForeignKey('site.id'))
name = db.Column(db.String())
def __init__(self, **kwargs):
super(Station, self).__init__(**kwargs)
当我从站点表中删除一行时,它只会使站点表上的site_id保留为空,因为我没有将其定义为非空列。我要删除的脚本是这样的:
>>> s = Site.query.filter_by(id=5).first()
>>> db.session.delete(s)
>>> db.session.commit()
但是当我手动从PgAdmin中删除时,它会告诉我:
ERROR: update or delete on table "site" violates foreign key constraint "station_site_id_fkey" on table "station"
DETAIL: Key (id)=(6) is still referenced from table "station".
通过sqlalchemy删除时,如何出现相同的错误?还是为什么会产生不同的行为?