为什么烧瓶sql炼金术不更新记录的属性?

时间:2016-06-10 01:20:17

标签: python flask sqlalchemy flask-sqlalchemy

我有一个如下课程:

class Account(db.Model, flask_login.UserMixin):
    __tablename__ = 'account'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(75))
    username = db.Column(db.String(50))
    password = db.Column(db.String(250))
    admin = db.Column(db.Boolean)

    def __init__(self, email='', username='', password='', admin=None):
        self.email = email
        self.username = username
        self.password = password
        self.admin = admin

    def __repr__(self):
        return '<Account %r>' % self.username

当我通过表单创建帐户时,admin属性将为None。但是,当我访问数据库并尝试手动将其设置为True时,该属性将更新,但是当我再次访问数据库时,该属性为None这非常烦人。

这是我在控制台上执行的内容:

account = Account.query.get(1)
account.admin = True
db.session.commit()
db.admin ----> True

exit()

#restart again
account = Account.query.get(1)
account.admin ----> None

我做错了什么?

2 个答案:

答案 0 :(得分:4)

这样做:

account = Account.query.get(1)
account.admin = True
db.session.merge(account)
db.session.commit()

将检测到更改并将其发送到数据库。

你拥有的实例和会话中的对象不一定是相同的 - 尽管它们代表相同的东西 - 它们不是同一个对象。 在Flask-SqlAlchemy中有一个配置SQLALCHEMY_TRACK_MODIFICATIONS,它使sqlalchemy可以按你的需要工作。但它非常昂贵,因为orm必须监控所有实例的更改。

希望这有帮助!

答案 1 :(得分:-3)

对象的更改未添加到会话中。所以正确的方法是

account = Account.query.get(1)
account.admin = True
db.session.add(account)
db.session.commit()