2016-01-30 16 views
0

我遇到了sqlalchemy問題,其中會話似乎成功提交,但數據未出現在基礎數據庫表中。但是,在提交之前和之後打印提交的項目時,會顯示數據。基本上,我想要做的是分配一個項目(要更新的行),然後更新數據庫中的計算值。SQLAlchemy:會話提交/刷新成功,但數據確實出現在數據庫中

任何提示,感激!如果下面的代碼不是最乾淨的,我會提前道歉 - 我剛剛開始自學python。

query_od_matrix = session.query(dr.ODMatrix).order_by(dr.ODMatrix.distance) 

def generate_bins(qry): 
mx = session.query(sa.func.max(dr.ODMatrix.origin_stops_id)).scalar() 
# Testing 
# print mx 

for o in range(1, mx+1): # o=origin, d=destination 
    query = qry.filter(dr.ODMatrix.origin_stops_id == o) 
    dest_id = [] 
    dest_dist = [] 

    for row in query: 
     # Testing 
     # print row.origin_stops_id, row.destination_stops_id, row.distance 
     dest_id.append(row.destination_stops_id) 
     dest_dist.append(row.distance) 

    # Testing 
    # print dest_id, dest_dist 
    no_items = len(dest_id) 

    for d in range(0, no_items): 
     # Testing 
     # print d, dest_id[d], dest_dist[d] 

     if d == 0: # First item 
      lower = 0 
      upper = 0.5 * (float(dest_dist[d]) + float(dest_dist[d+1])) 
     elif d == no_items-1: # Last item 
      lower = 0.5 * (float(dest_dist[d]) + float(dest_dist[d-1])) 
      upper = None 
     else: 
      lower = 0.5 * (float(dest_dist[d]) + float(dest_dist[d-1])) 
      upper = 0.5 * (float(dest_dist[d]) + float(dest_dist[d+1])) 

     item = dr.ODMatrix(origin_stops_id=o, destination_stops_id=dest_id[d]) 
     # Testing 
     # print d, dest_id[d], lower, upper 
     # print dest_id[d], item.destination_stops_id 
     item.bin_from = lower 
     item.bin_to = upper 
     # Testing 
     # session.dirty 
     # print item.origin_stops_id, item.destination_stops_id, item.bin_from, item.bin_to 
     session.commit() 
     # session.flush() 
     # Testing 
     # session.dirty 
     # print item.origin_stops_id, item.destination_stops_id, item.bin_from, item.bin_to 

回答

1

您需要將項目添加到會議之前提交

item = dr.ODMatrix(origin_stops_id=o, destination_stops_id=dest_id[d]) 
item.bin_from = lower 
item.bin_to = upper 
session.add(item) 
session.commit() 
+0

啊,謝謝!有時我覺得很蠢。但是,雖然這工作,它會創建新的行。有沒有辦法更新現有的? – Daniel

+0

要更新現有的只需設置新值並提交,就像這樣'item = session.query(dr.ODMatrix).first(); item.bin_form = new_value; session.commit()' –

+0

令人驚歎,非常感謝! – Daniel

相關問題