以下內容完全是一個數據庫小白的經驗之談,可能不太準確,見諒!
最近兩天試圖在樹莓派上部署一個web應用,具體目標就是將接收到的數據轉存到數據庫中,一個是本地的kudu數據庫,另一個是mysql數據庫
# 如kudu庫
impala.create_update_data('main', kudu_engine, df_main, 'main')
impala.create_update_data('child', kudu_engine, df_child, 'child')
impala.create_update_data('info', kudu_engine, df_info, 'info')
# 如mysql庫
mysql.create_update_data('main', mysql_engine, df_main, 'main')
mysql.create_update_data('child', mysql_engine, df_child, 'child')
mysql.create_update_data('info', mysql_engine, df_info, 'info')
# impala
with engine.begin() as conn:
conn.execute("UPSERT INTO {} ({}) VALUES ({})".format(table, keys, values))
# mysql
with engine.begin() as conn:
conn.execute("REPLACE INTO {} ({}) VALUES ({})".format(table, keys, values))
但發現一個令人抓狂的問題:在本地x86機器上完全沒問題,相同代碼在樹莓派上就完全看運氣了(某些請求能正常入庫,而大部分無法入庫,而且沒有任何異常)
最開始懷疑是因爲機器性能導致,但嘗試把導入kudu庫的功能去掉後,發現入mysql庫沒有問題,所以是導入kudu庫的代碼問題。
將impala的‘with engine.begin() as conn:’換成:
conn = engine.connect()
conn.execute("UPSERT INTO {} ({}) VALUES ({})".format(table, keys, values))
conn.close()
發現一切又恢復正常了
看來是‘with engine.begin() as conn:’這條語句導致的
查了一下,上面這條語句好像是爲了使用事物,但什麼是事物,還需要進一步學習,最終把所有的‘with engine.begin() as conn:’改成‘with engine.connect() as conn:’,正常了!
總而言之,這裏總結出的經驗就是別用with engine.begin() as conn