python使用pymysql操作MySQL錯誤代碼1054和1064處理方式
最近在學習用Python爬蟲,需要用到mysql來存儲從網絡上爬到的數據, 這里我也是借助了pymysql來操作mysql數據庫,但是在實際寫代碼操作數據庫的過程中遇到了好多坑(改到我懷疑人生。。。),這里記錄下我排雷的過程,也供大家來參考,希望對你們有所幫助。
錯誤代碼1064處理
這個錯誤可以說是我在編寫整個代碼的遇到的最大的錯誤,沒有之一!這里為了說明這個錯誤的情況,我將原來的部分代碼經過精簡過來舉例子。麻雀雖小,五臟俱全,話不多說,首先貼上我的渣渣代碼(手動捂臉~)。
import pymysql
if __name__ == '__main__':
connect = pymysql.connect(host='***.***.***.***',user='****',passwd='***',port=3306,database='test',charset='utf8')
cursor = connect.cursor()
table_name = 'person'
values = 'id int primary key auto_increment, name varchar(20)'
cursor.execute('create table %s (%s)',(table_name, values))
cursor.close()
connect.close()這里請自行將上面星號的部分替換成自己的信息,首先將自己的MySQL主機地址,用戶名和密碼。
運行上面的代碼,程序運行錯誤,錯誤代碼提示為1064,錯誤提示為
pymysql.err.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 ''person' ('id int primary key auto_increment, name varchar(20)')' at line 1")
上面的錯誤提示告訴我們在SQL語句的第一行出現了語法錯誤。
最初是認為SQL拼寫錯誤,仔細檢查后拼寫正確。后來經過查閱相關文檔和資料,發(fā)現自己犯了一個非常惡心的一個錯誤,原因竟然是將一個用百分號誤用成了逗號!竟然都沒有語法錯誤,下面的程序我們使用mogrify函數可以輸出待執(zhí)行的完整SQL語句,來對比下:
import pymysql
if __name__ == '__main__':
connect = pymysql.connect(host='***.***.***.***',user='****',passwd='***',port=3306,database='test',charset='utf8')
cursor = connect.cursor()
table_name = 'person'
values = 'id int primary key auto_increment, name varchar(20),age int'
sql_1 = cursor.mogrify('create table %s (%s)', (table_name,values))
sql_2 = cursor.mogrify('create table %s (%s)'% (table_name,values))
print(sql_1)
print(sql_2)
cursor.close()
connect.close()執(zhí)行上面的代碼,我們可以看一下輸出結果:
create table 'person' ('id int primary key auto_increment, name varchar(20), age int')
create table person (id int primary key auto_increment, name varchar(20), age int)
對比上面的輸出結果,我們可以發(fā)現上面的2個語句雖然沒有都沒有語法錯誤,但是構造出來的SQL語句大體上看也是差不多的,唯一的區(qū)別就在于:兩者構造的SQL的引號的差別??!,通過第一種方式構造出來的SQL語句是帶有引號的,第二種是沒有引號的。很明顯,可以在MySQL終端下運行的第二種SQL語句,沒想到自己鼓搗了半天的錯誤竟然是引號的問題 (心里一萬只草泥馬在奔騰)。
這里我根據自己的理解總結一下這兩者的區(qū)別吧,不對的地方還請大佬們批評指正:
1.對于上面的使用逗號作為分隔符的調用,構造出來的語句是直接將字符串替換掉SQL語句的占位符的,并且不會將引號去掉,會直接進行替換,這種做法會引起SQL語法錯誤,執(zhí)行失敗。
2.對于上面使用百分號作為分隔符的調用,構造出來的語句是將字符串的內容替換掉占位符(這種方式最常見),并不會將引號去掉,只將內容替換掉,這種做法會引起SQL語法錯誤,執(zhí)行失敗。
錯誤代碼1054處理
解決了上面的錯誤,本來以為整個程序可以順利執(zhí)行。當執(zhí)行到SQL的插入語句時,發(fā)現整個程序又無情地給了我一個大大的error,又是一個全新的錯誤(錯誤代碼1054),為了能夠比較清晰的說明錯誤情況,我還是給出一個簡化的程序,同時又能說明情況。
首先我們來一下示例中用到的person表的結構:

下面我的示例代碼
import pymysql
if __name__ == '__main__':
connect = pymysql.connect(host='***.***.***.***',user='****',passwd='***',port=3306,database='test',charset='utf8')
cursor = connect.cursor()
table_name = 'person'
values = (23,'李明')
cursor.execute('insert into %s(age,name) values (%s, %s)' % (table_name, values[0], values[1]))
cursor.close()
connect.close()執(zhí)行上面的代碼,程序又報錯了,錯誤代碼提示為1054,錯誤提示為:
pymysql.err.InternalError: (1054, "Unknown column '李明' in 'field list'")
上面的錯誤提示沒有什么我插入的值在field list 中不存在。什么鬼,這段代碼這么簡單,還會有錯。又是搜索各種解決方法還是無解。最終還是通過pymysql中的mogrify函數還看一下構造的SQL語句,下面的代碼可以查看我們實際構造的SQL到底是什么:
import pymysql
if __name__ == '__main__':
connect = pymysql.connect(host='***.***.***.***',port=3306,user='****',passwd='*****',database='test',charset='utf8')
cursor = connect.cursor()
table_name = 'person'
values= (23, '韓梅梅')
sen = cursor.mogrify('insert into %s(age, name) values(%s, %s)' % (table_name, values[0],values[1]))
print(sen)
cursor.close()
connect.close()上面的代碼輸出我們實際傳給MySQL執(zhí)行的SQL語句,程序的輸出結果為:
insert into person(age,name) values (23, 韓梅梅)
程序的輸出結果直覺看貌似是對的,沒有任何錯誤,但是在MySQL的終端下會報相同的錯誤,同樣找不到。后來經過恍然大悟,原來又是因為引號的問題,上面正確的SQL語句應該是
insert into person(age,name) values (23, '韓梅梅')
原來又是因為的錯誤才導致程序的錯誤。之所以出現上面的情況可以用上述解釋錯誤1064的錯誤原因來解釋:
使用百分號來作為分隔符只會簡單地將字符串的內容進行替換,而不會進行自動給字符串加上引號,因此上面構造的SQL語句是沒有加引號的,而我們SQL語句中待插入的值是需要加引號的,因此引發(fā)1054的錯誤。
經過上面的分析,我們可以給待在execute函數中給待插入的字符串手動加上引號來解決,下面貼上正確的代碼:
import pymysql
if __name__ == '__main__':
connect = pymysql.connect(host='***.***.***.***',port=3306,user='****',passwd='*****',database='test',charset='utf8')
cursor = connect.cursor()
table_name = 'person'
values= (23, '韓梅梅')
sen = cursor.mogrify('insert into %s(age, name) values(%s, "%s")' % (table_name, values[0],values[1])) # 相比上面的錯誤代碼,這里給姓名對應的占位符加上了引號
print(sen)
cursor.close()
connect.close()經過上面的調整,整個程序最終得以運行成功,數據可以正常存儲。
Tips:在這里我推薦大家如果在SQL執(zhí)行不成功的時候可以用pymysql的mogrify函數來查看構造的SQL語句,以便快速查看SQL出錯的地方,加快調試速度。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python datatable庫大型數據集和多核數據處理使用探索
這篇文章主要介紹了python datatable庫大型數據集和多核數據處理使用探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
windows系統(tǒng)IIS部署Django項目的實踐
采用IIS服務器部署相比django提供的開發(fā)者服務器具有更好的并發(fā)訪問能力,性能更加穩(wěn)定,本文主要介紹了windows系統(tǒng)IIS部署Django項目的實踐,具有一定的參考價值,感興趣的可以了解一下2022-03-03
使用IPython下的Net-SNMP來管理類UNIX系統(tǒng)的教程
這篇文章主要介紹了使用IPython下的Net-SNMP來管理類UNIX系統(tǒng)的教程,本文來自于IBM官方網站技術文檔,需要的朋友可以參考下2015-04-04

