一、前言
這個問題是博主在開發的時候,遇到需要在一個腳本里面連接兩個數據庫的需求,當時對於python2.7
不是很熟悉,所以想要在網上搜一下python2.7
是否可以同時連接兩個數據庫,只是並沒有一個明確的答案。加上當時腳本一直報錯,所以導致博主很懷疑是否同時連接兩個數據庫是不合理的。。
只是python
作爲一個成熟的語言,同時連接多個數據庫本來就是手到擒來的問題。本篇首先是要回答,python
是可以連接多個數據庫的,其次是記錄一下操作數據庫出現的問題。
二、雙數據庫操作遇到的bug
1、大致步驟
//連接
db1 = MySQLdb.connect(host=dbhost, user=dbuser, passwd=dbpass, db=dbname, port=dbport)
db2 = MySQLdb.connect(host=slavehost, user=slaveuser, passwd=slavepass, db=slavedb, port=dbport)
//獲取cursor對象
cursor = db1.cursor()
cursor_build = db2.cursor()
//操作數據庫
cursor.execute(sql1)
cursor_build.execute(sql2)
//結果
db1操作成功,db2操作無響應
如步驟所示,博主在操作的時候,發現db1
是可以正常執行的,但是到db2
就死活不成功,此時的腳本並沒有報錯。
2、打印相關信息
(1)打印db2的信息
mysql實例:<MySQLdb.cursors.Cursor object at 0x0000000002DA9908>
sql打印:直接在數據庫中執行sql無報錯
(2)打印cursor 對象
<_mysql.connection open to 'localhost' at 0000000002D42458>
<_mysql.connection open to 'localhost' at 0000000002D42E78>
可以看到兩個數據庫都是有cursor
對象的,而且並沒有什麼明顯的差異,都能正常操作數據庫纔對
(3)打印返回值
result = db2.execute(insert_build_sql) # 插入數據
print result
返回結果是1
,代表受影響行數是1
,但是實際上數據庫並沒有插入進去。關鍵是db1
還是插入成功了,簡直是無語。
三、問題所在
正在博主瘋狂搜索無果的時候,一個py
大佬剛好在羣上發消息,博主果斷抓住機會詢問這個博主,最終解決了這個問題。
在羣上諮詢py
大佬們,有個大佬問我是否開啓了autocommit
,這肯定是沒有的。本來db1
能插入成功,博主就想當然以爲db2
也能插入成功,不需要手動commit
之類的。然而我還是小看了python
,後來百度查詢才知道,MySQLdb
在連接後關閉了自動提交,行叭,很強勢。
在連接完db
之後,新增autocommit
屬性,設置自動提交
db1.autocommit(1)
db2.autocommit(1)
繼續測試,發現完美寫入。不過通過這件事也能發現mysqldb
操作mysql
的一些特性,一般來說,當只連接一個庫的時候,是可以進行正常的增刪改查的。但是當連接多個庫的時候,如果不顯式設置autocommit
的話,mysqldb
會自動在語句執行完加一句 set autocommit = 0
。衆所周知的是innodb
引擎的操作都是帶有事務特性的,關閉自動提交自然是無法成功執行sql
的。
四、總結
1、時刻謹記各個組件的原理,比如這次的問題,明明是mysql的innodb引擎問題,但是博主
關心則亂,因爲對Python不熟悉,就病急亂投醫,實在是不該。
2、出門在外靠朋友,遇到Bug找大佬
3、多加一些qq羣,微信羣之類的,哈哈
end