类型错误:无法将psycopg2.extensions.Binary转换为二进制。

6
我尝试通过sqlalchemy将客户端上传的二进制文件存储到postgresql中。通过对错误信息进行一些谷歌搜索,我找到了这个源文件:“包装对象不是字节或缓冲区,这是一个错误”。
   binaries = []
    for f in request.files.values():
        if f and allowed_file(f.filename):
            fn = secure_filename(f.filename)
            file_path = os.path.join(basedir, fn)
            f.save(file_path)
            #data = f.read()
            data = open(fn, 'rb').read()
            binaries.append(psycopg2.Binary(data))
            f.close()
    #does the escaping
    mytable=mytable(
    ...,
    document1 = binaries[0]
    ...
    )
    #Model
    class mytable(mydb.Model):
      document1 = mydb.Column(mydb.LargeBinary())

你正在使用Python 2还是3? - nathancahill
@nathancahill Python 2 - Kevin Q
我遇到了类似的问题,尝试将带有CronTrigger对象的Python字典存储在LargeBinary列中。那么你的研究结果是什么? - undefined
1个回答

3
将文件中的字节转换为psycopg2.Binary是不必要的。当SQLAlchemy使用DBAPI连接器将语句和值发送到数据库时(在本例中为psycopg2),这将自动发生。
例如:
with open(fn, 'rb') as f:
    bytes_ = f.read()
    instance = MyModel(document1=bytes_)
    session.add(instance)
    session.commit() 

这段代码适用于 Python2 和 Python3,并且通过 SQLAlchemy 1.3.x 的引擎生成以下输出:

2020-09-06 10:39:27,775 INFO sqlalchemy.engine.base.Engine INSERT INTO mytable (document1) VALUES (%(document1)s) RETURNING mytable.id
2020-09-06 10:39:27,775 INFO sqlalchemy.engine.base.Engine {'document1': <psycopg2.extensions.Binary object at 0x7f8ea012ff60>}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接