2016-06-10 34 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 –