【发布时间】:2014-09-01 09:00:59
【问题描述】:
我试图弄清楚 SQLAlchemy 处理外键的方式。
考虑这些模型:
class ModelOne(Base):
__tablename__ = 'model_one'
id = Column(Integer, primary_key=True)
...
class ModelTwo(Base):
__tablename__ = 'model_two'
id = Column(Integer, primary_key=True)
one_id = Column(Integer, ForeignKey('model_one.id'))
one = relationship('ModelOne')
我假设如果我们有两个这样的模型,那么 SQLAlchemy 会发现 ModelTwo.one_id 和 ModelTwo.one 指的是同一个数据库列。
在创建 ModelTwo 记录时,我们可以使用 ModelOne 记录的数字 ID,也可以使用 ModelOne 实例来填充 FK 字段:
one = DBSession.query(ModelOne)....
two_a = ModelTwo(one_id=one.id)
two_b = ModelTwo(one=one)
这行得通。
但这里有个转折点:在实例化 ModelTwo 实例之后,根据我们如何初始化 FK 字段,它的一种或另一种表示将保持未填充:
two_a.one is None # evaluates to True
two_b.one_id is None # evaluates to True
这是预期的行为吗?如果是这样,这在开发人员的头脑中一定是一个巨大的危险信号。当我们从数据库中检索记录作为声明性模型类的实例时,record.one 和 record.one_id 都将被填充,但是当我们创建新记录时,情况并非如此!
【问题讨论】:
标签: python sqlalchemy foreign-key-relationship