如何使用python将jpg存储在sqlite数据库中

Fil*_*pos 5 python sqlite jpeg pygtk gtk3

我已经尝试了很多天来找到这个问题的解决方案。我需要为 sqlite 数据库中的每条记录编写一个小 jpg 图像。最后,我设法插入了该文件,但从它作为原始文件而不是(压缩的)jpg 写入数据库的大小来看。我使用的代码是:

imgobj = Image.open('./fotocopies/checks/633.jpg')
con = sqlite3.connect("pybook.db")
cur = con.cursor()
cur.execute("UPDATE data_fotocopies SET fotocopy=? WHERE refid=633 and reftype=0", [ buffer(imgobj.tobytes()) ] )
Run Code Online (Sandbox Code Playgroud)

如果我尝试open该文件,则无法将其插入数据库,因此,以下代码:

imgobj = open('./fotocopies/checks/632.jpg')
con = sqlite3.connect("pybook.db")
cur = con.cursor()
cur.execute("UPDATE data_fotocopies SET fotocopy=? WHERE refid=632 and reftype=0", [sqlite3.Binary(imgobj)] )
Run Code Online (Sandbox Code Playgroud)

给出以下错误:

cur.execute("UPDATE data_fotocopies SET fotocopy=? WHERE refid=632 and reftype=0", [sqlite3.Binary(imgobj)] )
TypeError: buffer object expected
Run Code Online (Sandbox Code Playgroud)

不幸的是,stackoverflow 中以前的答案没有涵盖我,因为我已经尝试了所有这些答案。此外,所有存储检索都必须通过 gtk3 接口完成,我怀疑这将意味着另一个(一系列)问题,即如何设置现有图像以从数据库响应中获取其数据等。任何人都可以帮忙吗?

Fil*_*pos 2

最后,感谢 Andrej Kesely 的评论,我让它工作了。工作解决方案是

imgobj = base64.b64encode(open('./fotocopies/checks/624.jpg').read())
con = sqlite3.connect("pybook.db")
cur = con.cursor()
qf="UPDATE data_fotocopies SET fotocopy='%s' WHERE refid=%d AND reftype=0"%(lite.Binary(fotocopy_blob),id)
cur.execute(qf) #yes, it is dangerous for injection`
Run Code Online (Sandbox Code Playgroud)

并从数据库检索图像的操作如下:

qf="SELECT fotocopy FROM data_fotocopies WHERE refid=%d and reftype=0"%self.check_id
self.cur.execute(qf)
try:
    fd=base64.b64decode(self.cur.fetchall()[0][0])
    byting = GLib.Bytes(fd)
    self.fotocopy = Gio.MemoryInputStream.new_from_bytes(byting)
    ...
self.fotocopy_ent=self.builder.get_object("fotocopy")         # as it is made in glade
pixbuf = GdkPixbuf.Pixbuf.new_from_stream(self.fotocopy,None) #finally the pixbuf although 
                                                              #it produces errors if I have
                                                              #no stream/image to "feed" it.
self.fotocopy_ent.set_from_pixbuf(pixbuf)
Run Code Online (Sandbox Code Playgroud)

仍然无法弄清楚为什么我发现的所有其他解决方案都不起作用。我使用Python 2.7.6 ang gtk3,但我提交的这个是这样的。

感谢大家的帮助。