最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python使用pymysql操作MySQL錯(cuò)誤代碼1054和1064處理方式

 更新時(shí)間:2022年06月18日 09:21:11   作者:sodalife  
這篇文章主要介紹了python使用pymysql操作MySQL錯(cuò)誤代碼1054和1064處理方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

最近在學(xué)習(xí)用Python爬蟲,需要用到mysql來存儲(chǔ)從網(wǎng)絡(luò)上爬到的數(shù)據(jù), 這里我也是借助了pymysql來操作mysql數(shù)據(jù)庫,但是在實(shí)際寫代碼操作數(shù)據(jù)庫的過程中遇到了好多坑(改到我懷疑人生。。。),這里記錄下我排雷的過程,也供大家來參考,希望對你們有所幫助。

錯(cuò)誤代碼1064處理

這個(gè)錯(cuò)誤可以說是我在編寫整個(gè)代碼的遇到的最大的錯(cuò)誤,沒有之一!這里為了說明這個(gè)錯(cuò)誤的情況,我將原來的部分代碼經(jīng)過精簡過來舉例子。麻雀雖小,五臟俱全,話不多說,首先貼上我的渣渣代碼(手動(dòng)捂臉~)。

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()

這里請自行將上面星號(hào)的部分替換成自己的信息,首先將自己的MySQL主機(jī)地址,用戶名和密碼。

運(yùn)行上面的代碼,程序運(yùn)行錯(cuò)誤,錯(cuò)誤代碼提示為1064,錯(cuò)誤提示為

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")

上面的錯(cuò)誤提示告訴我們在SQL語句的第一行出現(xiàn)了語法錯(cuò)誤。

最初是認(rèn)為SQL拼寫錯(cuò)誤,仔細(xì)檢查后拼寫正確。后來經(jīng)過查閱相關(guān)文檔和資料,發(fā)現(xiàn)自己犯了一個(gè)非常惡心的一個(gè)錯(cuò)誤,原因竟然是將一個(gè)用百分號(hào)誤用成了逗號(hào)!竟然都沒有語法錯(cuò)誤,下面的程序我們使用mogrify函數(shù)可以輸出待執(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í)行上面的代碼,我們可以看一下輸出結(jié)果:

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)

對比上面的輸出結(jié)果,我們可以發(fā)現(xiàn)上面的2個(gè)語句雖然沒有都沒有語法錯(cuò)誤,但是構(gòu)造出來的SQL語句大體上看也是差不多的,唯一的區(qū)別就在于:兩者構(gòu)造的SQL的引號(hào)的差別??!,通過第一種方式構(gòu)造出來的SQL語句是帶有引號(hào)的,第二種是沒有引號(hào)的。很明顯,可以在MySQL終端下運(yùn)行的第二種SQL語句,沒想到自己鼓搗了半天的錯(cuò)誤竟然是引號(hào)的問題 (心里一萬只草泥馬在奔騰)。

這里我根據(jù)自己的理解總結(jié)一下這兩者的區(qū)別吧,不對的地方還請大佬們批評指正:

1.對于上面的使用逗號(hào)作為分隔符的調(diào)用,構(gòu)造出來的語句是直接將字符串替換掉SQL語句的占位符的,并且不會(huì)將引號(hào)去掉,會(huì)直接進(jìn)行替換,這種做法會(huì)引起SQL語法錯(cuò)誤,執(zhí)行失敗。

2.對于上面使用百分號(hào)作為分隔符的調(diào)用,構(gòu)造出來的語句是將字符串的內(nèi)容替換掉占位符(這種方式最常見),并不會(huì)將引號(hào)去掉,只將內(nèi)容替換掉,這種做法會(huì)引起SQL語法錯(cuò)誤,執(zhí)行失敗。

錯(cuò)誤代碼1054處理

解決了上面的錯(cuò)誤,本來以為整個(gè)程序可以順利執(zhí)行。當(dāng)執(zhí)行到SQL的插入語句時(shí),發(fā)現(xiàn)整個(gè)程序又無情地給了我一個(gè)大大的error,又是一個(gè)全新的錯(cuò)誤(錯(cuò)誤代碼1054),為了能夠比較清晰的說明錯(cuò)誤情況,我還是給出一個(gè)簡化的程序,同時(shí)又能說明情況。

首先我們來一下示例中用到的person表的結(jié)構(gòu):

在這里插入圖片描述

下面我的示例代碼

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í)行上面的代碼,程序又報(bào)錯(cuò)了,錯(cuò)誤代碼提示為1054,錯(cuò)誤提示為:

pymysql.err.InternalError: (1054, "Unknown column '李明' in 'field list'")

上面的錯(cuò)誤提示沒有什么我插入的值在field list 中不存在。什么鬼,這段代碼這么簡單,還會(huì)有錯(cuò)。又是搜索各種解決方法還是無解。最終還是通過pymysql中的mogrify函數(shù)還看一下構(gòu)造的SQL語句,下面的代碼可以查看我們實(shí)際構(gòu)造的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()

上面的代碼輸出我們實(shí)際傳給MySQL執(zhí)行的SQL語句,程序的輸出結(jié)果為:

insert into person(age,name) values (23, 韓梅梅)

程序的輸出結(jié)果直覺看貌似是對的,沒有任何錯(cuò)誤,但是在MySQL的終端下會(huì)報(bào)相同的錯(cuò)誤,同樣找不到。后來經(jīng)過恍然大悟,原來又是因?yàn)橐?hào)的問題,上面正確的SQL語句應(yīng)該是

insert into person(age,name) values (23, '韓梅梅')

原來又是因?yàn)榈腻e(cuò)誤才導(dǎo)致程序的錯(cuò)誤。之所以出現(xiàn)上面的情況可以用上述解釋錯(cuò)誤1064的錯(cuò)誤原因來解釋:

使用百分號(hào)來作為分隔符只會(huì)簡單地將字符串的內(nèi)容進(jìn)行替換,而不會(huì)進(jìn)行自動(dòng)給字符串加上引號(hào),因此上面構(gòu)造的SQL語句是沒有加引號(hào)的,而我們SQL語句中待插入的值是需要加引號(hào)的,因此引發(fā)1054的錯(cuò)誤。

經(jīng)過上面的分析,我們可以給待在execute函數(shù)中給待插入的字符串手動(dòng)加上引號(hào)來解決,下面貼上正確的代碼:

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])) # 相比上面的錯(cuò)誤代碼,這里給姓名對應(yīng)的占位符加上了引號(hào)
	print(sen)
	cursor.close()
	connect.close()

經(jīng)過上面的調(diào)整,整個(gè)程序最終得以運(yùn)行成功,數(shù)據(jù)可以正常存儲(chǔ)。

Tips:在這里我推薦大家如果在SQL執(zhí)行不成功的時(shí)候可以用pymysql的mogrify函數(shù)來查看構(gòu)造的SQL語句,以便快速查看SQL出錯(cuò)的地方,加快調(diào)試速度。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Php多進(jìn)程實(shí)現(xiàn)代碼

    Php多進(jìn)程實(shí)現(xiàn)代碼

    這篇文章主要介紹了Php多進(jìn)程實(shí)現(xiàn)編程實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • PyQt5組件讀取參數(shù)的實(shí)例

    PyQt5組件讀取參數(shù)的實(shí)例

    今天小編就為大家分享一篇PyQt5組件讀取參數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python datatable庫大型數(shù)據(jù)集和多核數(shù)據(jù)處理使用探索

    python datatable庫大型數(shù)據(jù)集和多核數(shù)據(jù)處理使用探索

    這篇文章主要介紹了python datatable庫大型數(shù)據(jù)集和多核數(shù)據(jù)處理使用探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • PyTorch的Debug指南

    PyTorch的Debug指南

    這篇文章主要介紹了PyTorch的Debug的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用PyTorch,感興趣的朋友可以了解下
    2021-05-05
  • windows系統(tǒng)IIS部署Django項(xiàng)目的實(shí)踐

    windows系統(tǒng)IIS部署Django項(xiàng)目的實(shí)踐

    采用IIS服務(wù)器部署相比django提供的開發(fā)者服務(wù)器具有更好的并發(fā)訪問能力,性能更加穩(wěn)定,本文主要介紹了windows系統(tǒng)IIS部署Django項(xiàng)目的實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-03-03
  • python3.6的venv模塊使用詳解

    python3.6的venv模塊使用詳解

    這篇文章主要介紹了python3.6的venv模塊使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • python中實(shí)現(xiàn)將多個(gè)print輸出合成一個(gè)數(shù)組

    python中實(shí)現(xiàn)將多個(gè)print輸出合成一個(gè)數(shù)組

    下面小編就為大家分享一篇python中實(shí)現(xiàn)將多個(gè)print輸出合成一個(gè)數(shù)組,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 史上最詳細(xì)的Python打包成exe文件教程

    史上最詳細(xì)的Python打包成exe文件教程

    這篇文章主要給大家介紹了關(guān)于Python打包成exe文件的相關(guān)資料,堪稱史上最詳細(xì)的教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 使用IPython下的Net-SNMP來管理類UNIX系統(tǒng)的教程

    使用IPython下的Net-SNMP來管理類UNIX系統(tǒng)的教程

    這篇文章主要介紹了使用IPython下的Net-SNMP來管理類UNIX系統(tǒng)的教程,本文來自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • Python?pandas數(shù)據(jù)預(yù)處理之行數(shù)據(jù)復(fù)制方式

    Python?pandas數(shù)據(jù)預(yù)處理之行數(shù)據(jù)復(fù)制方式

    這篇文章主要介紹了Python?pandas數(shù)據(jù)預(yù)處理之行數(shù)據(jù)復(fù)制方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02

最新評論

贵州省| 绿春县| 邵武市| 岱山县| 保德县| 蒙自县| 大田县| 迭部县| 仁寿县| 新巴尔虎右旗| 青河县| 漯河市| 务川| 广昌县| 青神县| 玉溪市| 乌拉特前旗| 抚远县| 兴安县| 玉门市| 曲水县| 综艺| 通化县| 罗山县| 武冈市| 林芝县| 都兰县| 耿马| 桐柏县| 漳平市| 江西省| 繁昌县| 文成县| 突泉县| 怀安县| 维西| 汉阴县| 墨江| 永福县| 寻乌县| 大竹县|