with engine.begin()和 with engine.connect()使用心得

以下內容完全是一個數據庫小白的經驗之談,可能不太準確,見諒!

最近兩天試圖在樹莓派上部署一個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

參考:https://docs.sqlalchemy.org/en/13/core/connections.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章