用python将web文件上载到mysql

用python将web文件上载到mysql,python,mysql,image,web,Python,Mysql,Image,Web,我是python新手,正在寻找一种执行“复杂”任务的方法 我需要将小图像(每个图像小于1mb)存储到数据库的Image列(blob)中。我的脚本当前检索读取文件所需的URL。到目前为止,我还没有找到一种方法来检索图像并将其上传到DB,而不将其写入HDD(以备用HDD) 我目前正在使用URLlib2和MySQL连接器,如果可能的话,我想继续使用它们,因为它们可以在Windows和Debian上工作 codes = [xx, aa, ab] # This line is simulated as i

我是python新手,正在寻找一种执行“复杂”任务的方法

我需要将小图像(每个图像小于1mb)存储到数据库的
Image
列(blob)中。我的脚本当前检索读取文件所需的URL。到目前为止,我还没有找到一种方法来检索图像并将其上传到DB,而不将其写入HDD(以备用HDD)

我目前正在使用URLlib2和MySQL连接器,如果可能的话,我想继续使用它们,因为它们可以在Windows和Debian上工作

codes = [xx, aa, ab] # This line is simulated as it is gerated by a long script run previously...

print "-> Downloading Flags..."
for code in codes:
    if not code == 'xx':
        filename = "%s-lgflag.gif" % code
        url = "%s%s" % (flagurl, filename)
        index = code.index(code)

        opener = urllib2.build_opener()
        opener.addheaders = [('User-agent', 'Mozilla/5.0')]
        infile = opener.open(url)
        pic = infile.read()

        update_time = int(time.time())

        wquery = ("UPDATE `cin`.`flags` SET `flag`='%s', `update_time`='%d' WHERE `name`='%s' AND `lockid`='%s'") % (pic_bin, update_time, names[index], lockid)
        cursor.execute(wquery)
        cnx.commit()
        sys.exit() ### Exit to make sure that I don't pass the whole list of 500+ flags
print "-> Flags downloaded"
此代码返回错误:

Traceback (most recent call last):
  File "C:\Users\***\flagstest.py", line 61, in <module>
    wquery = ("UPDATE `cin`.`flags` SET `flag`='%s', `update_time`='%d' WHERE `name`='%s' AND `lockid`='%s'") % (pic, update_time, names[index], lockid)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc1 in position 41: ordinal not in range(128)
回溯(最近一次呼叫最后一次):
文件“C:\Users\***\flagstest.py”,第61行,在
wquery=(“更新`cin`.`flags`设置`flag`='%s',`UPDATE\u time`='%d',其中`name`='%s'和`lockid`='%s'))%(图片,更新时间,名称[索引],lockid)
UnicodeDecodeError:“ascii”编解码器无法解码位置41中的字节0xc1:序号不在范围内(128)
希望任何人都能帮我找到一个在附近工作的方法

PS:我知道在DB中存储图像不是最好的解决方案,但由于DB是跨设备同步的,有些可能需要脱机数据访问,这些图像需要存储在那里。

在您的查询中:

 wquery = ("UPDATE `cin`.`flags` SET `flag`='%s', `update_time`='%d' WHERE `name`='%s' AND `lockid`='%s'") % (pic_bin, update_time, names[index], lockid)
基本上,您要做的是使用字符串格式系统从二进制文件创建字符串。在那里,python尝试将每个参数转换为字符串(即
str(picu bin)
),然后用该字符串替换字符串中匹配的
%s
。您应该使用光标的系统:

wquery = "UPDATE `cin`.`flags` SET `flag`='%s', `update_time`='%d' WHERE `name`='%s' AND `lockid`='%s'"
cursor.execute(wquery, (pic_bin, update_time, names[index], lockid))
看看其他的


HTH

谢谢,我知道变量的使用方式不正确,但无法通过谷歌找到。。。但我仍然得到了这个错误:回溯(最近一次调用最后一次):文件“C:\Users…\Xflags.py”,第61行,在cursor.execute(wquery,(pic\u-bin,update\u-time,names[index],lockid,))文件“C:\Python27\lib\site packages\mysql\connector\cursor.py”,第381行,在execute“字符串格式化过程中参数数量错误”)编程错误:字符串格式化期间参数的数目错误