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)上找了大半天才找倒原因問題,pymysql中的參數(shù)%s是不用加''號(hào)的,當(dāng)我們插入字符串的時(shí)候可能不會(huì)應(yīng)為這個(gè)問題報(bào)錯(cuò),因?yàn)樽址旧硪灿幸?hào),再次加引號(hào)不會(huì)報(bào)錯(cuò),但二進(jìn)制格式的話就會(huì)報(bào)錯(cuò)
圖片如何以二進(jìn)制存入mysql
MYSQL 支持把圖片存入數(shù)據(jù)庫(kù),也相應(yīng)的有一個(gè)專門的字段 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") #打開本地圖片,路徑要寫自己的
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() #斷開連接
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計(jì)算程序運(yùn)行時(shí)間的方法
這篇文章主要介紹了Python計(jì)算程序運(yùn)行時(shí)間的方法,分別記錄起始時(shí)間與結(jié)束時(shí)間,計(jì)算兩者之間的差值來(lái)獲得程序的運(yùn)行時(shí)間,需要的朋友可以參考下2014-12-12
Python中的Descriptor描述符學(xué)習(xí)教程
簡(jiǎn)單來(lái)說(shuō),數(shù)據(jù)描述符是指實(shí)現(xiàn)了__get__、__set__、__del__方法的類屬性,等效于定義了三個(gè)方法的接口,下面就來(lái)詳細(xì)看一下Python中的Descriptor修飾符學(xué)習(xí)教程2016-06-06
基于Python編寫將文本轉(zhuǎn)換為語(yǔ)音的簡(jiǎn)易應(yīng)用
這篇文章主要介紹了如何使用Python編寫一個(gè)簡(jiǎn)單的應(yīng)用程序,將文本轉(zhuǎn)換為語(yǔ)音,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下2023-08-08
Python結(jié)合requests和Cheerio處理網(wǎng)頁(yè)內(nèi)容的操作步驟
Python因其簡(jiǎn)潔明了的語(yǔ)法和強(qiáng)大的庫(kù)支持,成為了編寫爬蟲程序的首選語(yǔ)言之一,requests庫(kù)是Python中用于發(fā)送HTTP請(qǐng)求的第三方庫(kù),而Cheerio庫(kù)則是一個(gè)用于解析HTML和XML文檔的庫(kù),本文給大家介紹了Python結(jié)合requests和Cheerio處理網(wǎng)頁(yè)內(nèi)容的操作步驟2025-01-01
Python?logging日志模塊的概念與實(shí)踐講解
本文通過具體的代碼示例為大家解釋了如何高效地使用logging模塊進(jìn)行日志記錄,以及如何避免常見的陷阱,希望可以幫助大家更好地掌握這個(gè)強(qiáng)大的工具2023-07-07
使用Python腳本在Linux下實(shí)現(xiàn)部分Bash Shell的教程
這篇文章主要介紹了使用Python腳本在Linux下實(shí)現(xiàn)部分Bash Shell的教程,包括一些簡(jiǎn)單的輸入輸出和郵件功能,需要的朋友可以參考下2015-04-04

