<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近在學習用Python爬蟲,需要用到mysql來儲存從網路上爬到的資料, 這裡我也是藉助了pymysql來操作mysql資料庫,但是在實際寫程式碼運算元據庫的過程中遇到了好多坑(改到我懷疑人生。。。),這裡記錄下我排雷的過程,也供大家來參考,希望對你們有所幫助。
這個錯誤可以說是我在編寫整個程式碼的遇到的最大的錯誤,沒有之一!這裡為了說明這個錯誤的情況,我將原來的部分程式碼經過精簡過來舉例子。麻雀雖小,五臟俱全,話不多說,首先貼上我的渣渣程式碼(手動捂臉~)。
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拼寫錯誤,仔細檢查後拼寫正確。後來經過查閱相關檔案和資料,發現自己犯了一個非常噁心的一個錯誤,原因竟然是將一個用百分號誤用成了逗號!竟然都沒有語法錯誤,下面的程式我們使用mogrify函數可以輸出待執行的完整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()
執行上面的程式碼,我們可以看一下輸出結果:
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)
對比上面的輸出結果,我們可以發現上面的2個語句雖然沒有都沒有語法錯誤,但是構造出來的SQL語句大體上看也是差不多的,唯一的區別就在於:兩者構造的SQL的引號的差別!!,通過第一種方式構造出來的SQL語句是帶有引號的,第二種是沒有引號的。很明顯,可以在MySQL終端下執行的第二種SQL語句,沒想到自己鼓搗了半天的錯誤竟然是引號的問題 (心裡一萬隻草泥馬在奔騰)。
這裡我根據自己的理解總結一下這兩者的區別吧,不對的地方還請大佬們批評指正:
1.對於上面的使用逗號作為分隔符的呼叫,構造出來的語句是直接將字串替換掉SQL語句的預留位置的,並且不會將引號去掉,會直接進行替換,這種做法會引起SQL語法錯誤,執行失敗。
2.對於上面使用百分號作為分隔符的呼叫,構造出來的語句是將字串的內容替換掉預留位置(這種方式最常見),並不會將引號去掉,只將內容替換掉,這種做法會引起SQL語法錯誤,執行失敗。
解決了上面的錯誤,本來以為整個程式可以順利執行。當執行到SQL的插入語句時,發現整個程式又無情地給了我一個大大的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()
執行上面的程式碼,程式又報錯了,錯誤程式碼提示為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執行的SQL語句,程式的輸出結果為:
insert into person(age,name) values (23, 韓梅梅)
程式的輸出結果直覺看貌似是對的,沒有任何錯誤,但是在MySQL的終端下會報相同的錯誤,同樣找不到。後來經過恍然大悟,原來又是因為引號的問題,上面正確的SQL語句應該是
insert into person(age,name) values (23, '韓梅梅')
原來又是因為的錯誤才導致程式的錯誤。之所以出現上面的情況可以用上述解釋錯誤1064的錯誤原因來解釋:
使用百分號來作為分隔符只會簡單地將字串的內容進行替換,而不會進行自動給字串加上引號,因此上面構造的SQL語句是沒有加引號的,而我們SQL語句中待插入的值是需要加引號的,因此引發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執行不成功的時候可以用pymysql的mogrify函數來檢視構造的SQL語句,以便快速檢視SQL出錯的地方,加快偵錯速度。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45