给出一个简单的基于声明的类;
class Entity(db.Model):
__tablename__ = 'brand'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), nullable=False)
下一个脚本
entity = Entity()
entity.name = 'random name'
db.session.add(entity)
db.session.commit()
# Just by accessing the property name of the created object a
# SELECT statement is sent to the database.
print entity.name
当我在SQLAlchemy中启用echo
模式时,我可以在终端中看到 INSERT
语句和一个额外的 SELECT
就在我访问模型的属性(列)时(表行)。
如果我不访问任何属性,则不会创建查询。
这种行为的原因是什么?在这个基本示例中,我们已经为该对象分配了name
属性的值。那么,为什么需要一个额外的查询?它确保了最新的价值,或类似的东西?
答案 0 :(得分:0)
默认情况下,SQLAlchemy会在您提交时使会话中的对象失效。这是通过expire_on_commit
参数控制的。
这背后的原因是实例背后的行可能已在事务之外被修改,所以如果你不小心你可能会遇到数据竞争,但如果你知道你在做什么,你可以安全地关闭它