为什么SQLAlchemy在访问持久化模型属性时发送额外的SELECT

时间:2016-10-07 20:11:45

标签: python sqlalchemy flask-sqlalchemy

给出一个简单的基于声明的类;

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属性的值。那么,为什么需要一个额外的查询?它确保了最新的价值,或类似的东西?

1 个答案:

答案 0 :(得分:0)

默认情况下,SQLAlchemy会在您提交时使会话中的对象失效。这是通过expire_on_commit参数控制的。

这背后的原因是实例背后的行可能已在事务之外被修改,所以如果你不小心你可能会遇到数据竞争,但如果你知道你在做什么,你可以安全地关闭它