一,、前言 這個(gè)問題是博主在開發(fā)的時(shí)候,,遇到需要在一個(gè)腳本里面連接兩個(gè)數(shù)據(jù)庫的需求,,當(dāng)時(shí)對(duì)于python2.7不是很熟悉,,所以想要在網(wǎng)上搜一下python2.7是否可以同時(shí)連接兩個(gè)數(shù)據(jù)庫,只是并沒有一個(gè)明確的答案,。加上當(dāng)時(shí)腳本一直報(bào)錯(cuò),所以導(dǎo)致博主很懷疑是否同時(shí)連接兩個(gè)數(shù)據(jù)庫是不合理的,。,。 只是python作為一個(gè)成熟的語言,同時(shí)連接多個(gè)數(shù)據(jù)庫本來就是手到擒來的問題,。本篇首先是要回答,,python是可以連接多個(gè)數(shù)據(jù)庫的,其次是記錄一下操作數(shù)據(jù)庫出現(xiàn)的問題,。 二,、雙數(shù)據(jù)庫操作遇到的bug 1、大致步驟
如步驟所示,,博主在操作的時(shí)候,發(fā)現(xiàn)db1是可以正常執(zhí)行的,,但是到db2就死活不成功,,此時(shí)的腳本并沒有報(bào)錯(cuò)。 2,、打印相關(guān)信息 (1)打印db2的信息 mysql實(shí)例:<MySQLdb.cursors.Cursor object at 0x0000000002DA9908> sql打?。褐苯釉跀?shù)據(jù)庫中執(zhí)行sql無報(bào)錯(cuò) (2)打印cursor 對(duì)象 <_mysql.connection open to 'localhost' at 0000000002D42458> 可以看到兩個(gè)數(shù)據(jù)庫都是有cursor 對(duì)象的,而且并沒有什么明顯的差異,,都能正常操作數(shù)據(jù)庫才對(duì) (3)打印返回值 result = db2.execute(insert_build_sql) # 插入數(shù)據(jù) 返回結(jié)果是1 ,,代表受影響行數(shù)是1,,但是實(shí)際上數(shù)據(jù)庫并沒有插入進(jìn)去。關(guān)鍵是db1還是插入成功了,,簡(jiǎn)直是無語,。 三、問題所在 正在博主瘋狂搜索無果的時(shí)候,,一個(gè)py大佬剛好在群上發(fā)消息,,博主果斷抓住機(jī)會(huì)詢問這個(gè)博主,最終解決了這個(gè)問題,。 咨詢py大佬們,,有個(gè)大佬問是否開啟了autocommit,這肯定是沒有的,。本來db1能插入成功,,博主就想當(dāng)然以為db2也能插入成功,不需要手動(dòng)commit之類的,。然而還是小看了python,,后來百度查詢才知道,MySQLdb 在連接后關(guān)閉了自動(dòng)提交,,行叭,,很強(qiáng)勢(shì)。 在連接完db之后,,新增autocommit屬性,,設(shè)置自動(dòng)提交 db1.autocommit(1) 繼續(xù)測(cè)試,發(fā)現(xiàn)完美寫入,。不過通過這件事也能發(fā)現(xiàn)mysqldb操作mysql的一些特性,,一般來說,當(dāng)只連接一個(gè)庫的時(shí)候,,是可以進(jìn)行正常的增刪改查的,。但是當(dāng)連接多個(gè)庫的時(shí)候,如果不顯式設(shè)置autocommit的話,,mysqldb 會(huì)自動(dòng)在語句執(zhí)行完加一句 set autocommit = 0,。眾所周知的是innodb引擎的操作都是帶有事務(wù)特性的,關(guān)閉自動(dòng)提交自然是無法成功執(zhí)行sql的,。 四,、總結(jié) 時(shí)刻謹(jǐn)記各個(gè)組件的原理,比如這次的問題,,明明是mysql的innodb引擎問題,,但是博主 關(guān)心則亂,因?yàn)閷?duì)Python不熟悉,就病急亂投醫(yī),,實(shí)在是不該,。 |
|