python中使用mysql要注意的問題

最近在爬蟲有些進展,決定用mysql儲存數據。今天遇到了很多問題,一一記下來作爲備忘。

雖然說root用戶最好不用,但是,新增加一個數據庫之後,權限的設置着實讓人頭疼,有時候把所有的權限都給了,依然說沒有權限。最好是用root測試完成之後,再替換上已經授權的用戶。如果出現問題,可以定位在權限上。

打開數據庫:

self.db = MySQLdb.connect(host="localhost", port=3307, user='root', passwd='passwd', db='database')
如果數據庫不在本地,把localhost修改成相應的ip。database最好在這一步決定。

新建光標:

self.cursor = self.db.cursor()
光標相當於一個指針,這樣我們就可以利用它的execute屬性執行sql語句了。比如我要寫入內容:

insert into login_time (name,login_time) values ('name','time')

我的程序裏要多次插入,因此要動態的生成這個語句:

sql = "insert into login_time (name,login_time) values (%s,%s)"\
                %(self.names[item], self.times[item])
但是程序一直報錯:

_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''\\u4f55\\u5319','1411286990000')' at line 1")
把那條語句單獨拿出來去mysql終端去運行,又什麼問題都沒有。把那條語句反覆print之後,發現問題在於%s,self.names[item]是字符串,去替換%s之後,就去掉了'',而執行SQL語句的時候,''表示字符串,又是必要的。修改成%r:

sql = "insert into login_time (name,login_time) values (%r,%r)"\
                %(self.names[item].encode, self.times[item])
發現依然報錯。問題還是一樣,不過根據我的經驗,我的做法是對的,只是問題又出在了哪裏呢?試驗了各種輸出之後,發現name是unicode編碼,字符串前有u。討人厭的編碼啊。以前遇到過,輕鬆解決:

sql = "insert into login_time (name,login_time) values (%r,%r)"\
                %(self.names[item].encode('raw_unicode_escape'), self.times[item])
送了一口氣,把程序執行一遍,沒有錯誤,神清氣爽,但是尼,數據庫是空的。

我反反覆覆在每個地方檢查,發現程序確實執行了SQL語句,而且我把SQL語句放到mysql的終端上運行,並沒有問題。查了一下,發現mysql執行完之後還要提交,關閉光標,關閉數據庫!!!!

self.db.commit()
self.cursor.close()
self.db.close()
就是這三劍客了。明天上我的爬蟲的成果。

————————————————

github主頁:https://github.com/gt11799 

E-mail:[email protected]

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