python3往mysql插入二進(jìn)制圖片出現(xiàn)1064錯(cuò)誤
往mysql插入二進(jìn)制圖片1064錯(cuò)誤
conn = pymysql.connect(*) cur = conn.cursor() os.chdir('/home/jibo/zxcsSpider/images/full/') list = os.listdir() count1 = 0 for imagename in list: count1 += 1 f = open(imagename, 'rb') data = f.read() f.close() imagepath = '/home/images/full/' + imagename imagebin = pymysql.Binary(data) sql = "insert into images(imagename,imagepath,imagebin) values('%s', '%s', '%s')" cur.execute(sql, (imagename, imagepath, imagebin)) conn.commit() print('image:' + str(count1)) cur.close() conn.close()
上面代碼運(yùn)行時(shí),mysql會(huì)報(bào)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 'cecedd67b6d4716bdbab9fac36e0b2ad1c81cbac.jpg'', ''/home/images/f' at line 1")
修改:將('%s', '%s', '%s')改為(%s, %s, %s)
conn = pymysql.connect(*) cur = conn.cursor() os.chdir('/home/images/full/') list = os.listdir() count1 = 0 for imagename in list: count1 += 1 f = open(imagename, 'rb') data = f.read() f.close() imagepath = '/home/images/full/' + imagename imagebin = pymysql.Binary(data) sql = "insert into images(imagename,imagepath,imagebin) values(%s, %s, %s)" cur.execute(sql, (imagename, imagepath, imagebin)) conn.commit() print('image:' + str(count1)) cur.close() conn.close()
再次運(yùn)行成功;
因?yàn)槟承┪臋n干擾,在網(wǎng)上找了大半天才找倒原因問(wèn)題,pymysql中的參數(shù)%s是不用加''號(hào)的,當(dāng)我們插入字符串的時(shí)候可能不會(huì)應(yīng)為這個(gè)問(wèn)題報(bào)錯(cuò),因?yàn)樽址旧硪灿幸?hào),再次加引號(hào)不會(huì)報(bào)錯(cuò),但二進(jìn)制格式的話(huà)就會(huì)報(bào)錯(cuò)
圖片如何以二進(jìn)制存入mysql
MYSQL 支持把圖片存入數(shù)據(jù)庫(kù),也相應(yīng)的有一個(gè)專(zhuān)門(mén)的字段 BLOB (Binary Large Object)
首先要在你的mysql數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)表,用于存儲(chǔ)圖片
CREATE TABLE Images(Id INT PRIMARY KEY AUTO_INCREMENT, Data MEDIUMBLOB);
然后用python代碼將本地的圖片存到數(shù)據(jù)庫(kù)中
# coding=utf-8 import MySQLdb import sys try: fin = open("/home/dsq/tb/8.jpg") #打開(kāi)本地圖片,路徑要寫(xiě)自己的 img = fin.read() fin.close() #讀取結(jié)束,關(guān)閉文件 except IOError as e: print "Error %d: %s" % (e.args[0], e.args[1]) sys.exit(1) #出現(xiàn)錯(cuò)誤打印錯(cuò)誤并退出 try: conn = MySQLdb.connect(host="localhost", port=3306, user="root", passwd="#你的數(shù)據(jù)庫(kù)密碼#", db="數(shù)據(jù)庫(kù)名") #連接到數(shù)據(jù)庫(kù) cursor = conn.cursor() #獲取cursor游標(biāo) cursor.execute("INSERT INTO Images SET Data='%s'" % MySQLdb.escape_string(img)) #執(zhí)行SQL語(yǔ)句 conn.commit() #提交數(shù)據(jù) cursor.close() conn.close() #斷開(kāi)連接 except MySQLdb.Error,e: conn.rollback() print "Error %d: %s" % (e.args[0], e.args[1]) sys.exit(1) #出現(xiàn)錯(cuò)誤,自動(dòng)回滾,打印錯(cuò)誤并退出
發(fā)現(xiàn)圖片成功存儲(chǔ)到數(shù)據(jù)庫(kù)中
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python爬蟲(chóng)Scrapy框架CrawlSpider原理及使用案例
這篇文章主要介紹了Python爬蟲(chóng)Scrapy框架(CrawlSpider),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Numpy中np.max的用法及np.maximum區(qū)別
這篇文章主要介紹了Numpy中np.max的用法及np.maximum區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11使用torchtext導(dǎo)入NLP數(shù)據(jù)集的操作
這篇文章主要介紹了使用torchtext導(dǎo)入NLP數(shù)據(jù)集的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05pytest接口自動(dòng)化測(cè)試框架搭建的全過(guò)程
pytest是Python的一種單元測(cè)試框架,可用來(lái)組織用例執(zhí)行,用例斷言,下面這篇文章主要給大家介紹了關(guān)于pytest接口自動(dòng)化測(cè)試框架搭建的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07python中的turtle庫(kù)函數(shù)簡(jiǎn)單使用教程
這篇文章主要介紹了python中的turtle庫(kù)函數(shù)簡(jiǎn)單使用教程。本文通過(guò)圖片的形式給大家展示的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-07-07Python語(yǔ)法之精妙的十個(gè)知識(shí)點(diǎn)(裝B語(yǔ)法)
本文精心篩選了最能展現(xiàn) Python 語(yǔ)法之精妙的十個(gè)知識(shí)點(diǎn),并附上詳細(xì)的實(shí)例代碼,需要的朋友可以參考下2020-01-01Python使用Beets模塊實(shí)現(xiàn)自動(dòng)整理音樂(lè)庫(kù)
Beets是一個(gè)功能強(qiáng)大的Python庫(kù),用于處理音樂(lè)文件的元數(shù)據(jù),在本文中,我們將探討beets模塊的常見(jiàn)使用方法,感興趣的可以跟隨小編一起學(xué)習(xí)一下2024-03-03