2013-01-01 79 views
2

我想更新數據庫中的一行(如果存在),或者如果它不存在,則創建它。在另一個類方法我此Flask-SQLAlchemy不會更新或刪除一行

​​

然後,稍後:

if self.user is not None: 
    self.user.foo = bar # etc. Change the attributes of self.user 
else: 
    self.user = models.User(bar, ...) # create a new model 
    db.session.add(self.user) 
db.session.commit() 

問題是,相應的行中的

我有一個類,首先將實例變量user數據庫不會更新。我也嘗試過這種做法:

if self.user is not None: 
    self.user.foo = bar 
else: 
    self.user = models.User(bar, ...) 
db.session.add(self.user) # add it to the session either way 
db.session.commit() 

這裏,db.session.add()調用失敗sqlalchemy.exc.InvalidRequestError: Object '<User at 0x7f4918172890>' is already attached to session '1' (this is '2')

而且我想的第一件事就是刪除在所有情況下,現有的模型,然後創建一個新的,即:

if self.user is not None: 
    db.session.delete(self.user) 
self.user = models.User(bar, ...) 
db.session.add(self.user) 
db.session.commit() 

在這種情況下db.session.delete()調用失敗具有相同already attached to session '1'消息如上。

爲什麼對象附加到不同的會話,而不是相同的?我如何正確地做到這一點?

回答

-1

要使用Flask-SQLAlchemy更新現有記錄,您不需要重新創建整個User對象並將其添加到會話中。您只需更新特定字段(例如foo)即可。然後你可以做數據庫提交。

你可以做如下的精確要求:

第1步:查詢現有用戶對象

user = models.User.query.filter_by(entity=self.entityUrl).first() 

第2步:

if user is not None: 
    user.foo = bar 
else: 
    user = User(...) 
    db.session.add(user) 

第3步:提交DB會話。

db.session.commit() 
+0

這正是我的代碼所做的,除了步驟1與步驟2-3的方法不同。而數據庫不會更新。我會看看我是否可以將其減少到最小范例。 –

+0

好吧,我以爲你說過「#把它添加到會議的任何方式」。這可能是問題。如果它是新用戶,您只想將其添加到會話中。在我的第2步中,我只添加到else塊中的會話。你也一樣嗎? – codegeek

+0

如前所述,我嘗試了兩種方法。如果我在修改會話時將其添加到會話中,則會出現錯誤(與您所說的內容相符)。如果我不這樣做,它不會更新。 –

0

確保你班上的foo屬性存在。接下來,您使用它的方式可能有問題。因爲我看到你使用「self.user ....」。首先嚐試最簡單的事情。然後一步一步。

下面的代碼是錯誤的:

if self.user is not None: 
    self.user.foo = bar 
else: 
    self.user = models.User(bar, ...) 
db.session.add(self.user) # add it to the session either way 
db.session.commit() 

無需db.session.add,如果要更新的記錄。

相關問題