2016-06-07 74 views
0

我使用下面的代碼通道postgres的DB對象的變化:SQLAlchemy的不承諾

@app.route('/budget_item/<int:budget_id>/edit', methods=['GET', 'POST']) 
    def budget_item_edit(budget_id): 


budget_item = session.query(Budget).filter_by(id=budget_id).one() 
print "Start EDIT sequence" 


# Return form data from HTML initial load form 
elif request.method == 'POST': 

    budget_amount_reallocated_total = budget_item.budget_amount_reallocated_total 


    #ORIGINAL BUDGET 
    if request.form['transaction_type'] == 'Original Budget': 

    #amount 
    if request.form['amount'] == "": 
     amount = 0 
    else: 
     amount = float(str(request.form['amount'])) 

    budget_item = Budget(
     #created_date = "", 
     budget_transaction_type = request.form['transaction_type'], 
     budget_line = request.form['budget_line'], 
     amount = amount, 
     description = request.form['description'] 
     #date_received = request.form['date_received'] 
    ) 

    try: 
     count = 1 

     while count < 10000: 
     count += 1 

     #budget_line 
     setattr(budget_item,'budget_line'+str(count),request.form['budget_line'+str(count)]) 

     #amount 
     setattr(budget_item,'amount'+str(count),float(request.form['amount'+str(count)])) 
     budget_amount_reallocated_total += float(request.form['amount'+str(count)]) 
     setattr(budget_item, 'budget_amount_reallocated_total', budget_amount_reallocated_total) 

     #description 
     setattr(budget_item,'description'+str(count), request.form['description'+str(count)]) 

     #date_received 
     setattr(budget_item,'date_received'+str(count),request.form['date_received'+str(count)]) 
     session.commit() 

    except: 
     session.commit() 
     return redirect(url_for('budget_master')) 

    else: 
    print "I'm done! This is not a post request" 

的代碼塊是設置於通過POST請求從HTML傳遞數據的然後更新在一個對應的對象Postgres DB。我可以確認從DB「budget_item」查詢的對象正在由settattr更新。在最後,我使用commit()來更新對象;但是,數據庫並未反映這些更改。爲了測試以確保事情正在流動,我嘗試了session.add(budget_item),然後是session.commit()以確保連接到數據庫正常。這樣可行。我如何將這個budget_item對象更新到數據庫中?任何幫助深表感謝。

+1

你想做什麼?您似乎正在將_50000!_新屬性添加到_new_「預算」實例。請注意,第二個'budget_item'是與您最初檢索的實例不同的實例。由於映射中不存在這些屬性(當然,我假設它們沒有),更新'budget_item'將不會有任何影響。另外,這是一個新的實例,所以你需要將它添加到會話中。也許你應該多解釋一下你試圖做的事情。 – mhawke

回答

0

我認爲,一個簡單的

budget_item.budget_amount_reallocated_total = budget_amount_reallocated_total 
session.add(budget_item) 
session.commit() 

是做

+0

不幸的是,這不僅僅是編輯一個現有的對象,而是複製了數據庫中的對象......離開舊對象並添加一個新對象。 – user3308477

0

正確的方式來回答你的問題,更新已經存在於數據庫中的budget_item你需要更新Budget實例您從數據庫中檢索,即

budget_item = session.query(Budget).filter_by(id=budget_id).one() 

不是你已經與新創建的一個:

budget_item = Budget(...) 

這裏第一個budget_item代表數據庫中的行,所以這是要更新的行。爲此,你可以替換與此形成了第二Budget實例代碼:

budget_item.budget_transaction_type = request.form['transaction_type'] 
budget_item.budget_line = request.form['budget_line'] 
budget_item.amount = amount 
budget_item.description = request.form['description'] 

一旦你完成更新Budget情況下,你可以調用session.commit()它刷新到數據庫中。

正如我在你的問題的評論中提到的,你似乎試圖添加大量的附加屬性到budget_item所有這些將被sqlalchemy忽略,除非它們在Budget實例和Budget表。

+0

這完全正確。謝謝。行budget_item =預算(...)實際上是實例化一個新的對象,而不僅僅是從數據庫更新查詢的對象。當我修改它時,原來的budget_item正確更新。謝謝! (至於額外的屬性,是的,我應該修改代碼,我的html表單只允許10個屬性,就像我的數據庫表一樣。我將循環設置爲10000個可能的通行證,以便稍後回來向前端表單添加更多屬性和db表。現在,循環停止運行,當它們沒有相應的POST請求字典時,它會發出命中和異常。 – user3308477