2016-06-10 52 views
1

我有以下所示的类:为什么不使用flask sql alchemy更新记录的属性?

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 

当我通过表单创建一个帐户,管理员属性将是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 

我在做什么错?

+0

'get'不需要重新获取记录。当'account.admin'为'None'时,你确定你有一个干净的会话吗? – univerio

+0

除非'db.admin'不是错字(应该是'account.admin'),否则我无法重现您的问题。请[edit]包含[mcve]。 – davidism

回答

1

只是这样做:

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

的变化将被检测并发送到数据库。

您拥有的实例和会话中的对象不一定是相同的 - 尽管它们表示相同的事物 - 它们不是同一个对象。 在Flask-SqlAlchemy中有一个配置SQLALCHEMY_TRACK_MODIFICATIONS,可以使sqlalchemy按需要工作。但是它非常昂贵,因为orm将不得不监视所有实例的更改。

希望这会有所帮助!

-2

对对象的更改未添加到会话中。因此,正确的方法是

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

为什么要将帐户添加到会话中?它已经存在于数据库中,否则Account.query.get(1)将是none。 –

+0

'db.session'不仅用于创建新的数据库记录,即__insert queries__。数据库的更新也通过它进行管理。所以上面的__update query__必须被添加到它。 –

+0

我知道什么是db.session。问题在于你的db.session.add(account)将Account实例添加到会话中,最后在调用commit()时,它将被添加到数据库中。看到这个http://stackoverflow.com/questions/6699360/flask-sqlalchemy-update-a-rows-information –