python - TypeError : can't escape psycopg2. extensions.Binary to binary

标签 python postgresql sqlalchemy psycopg2

我尝试通过 sqlalchemy 将二进制文件存储到 postgresql 中,并从客户端上传文件。
对错误消息的一点谷歌把我带到 this source file :“包装的对象不是字节或缓冲区,这是一个错误”

   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())

最佳答案

将文件中的字节转换为 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>}

关于python - TypeError : can't escape psycopg2. extensions.Binary to binary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30245395/

相关文章:

python - SQLAlchemy 匹配子句

postgresql - 在 postgres 中恢复转储后,一些主键丢失

python - 如何确保与 sqlite 和 NFS 的安全文件同步

python - Mac OS X - 环境错误 : mysql_config not found

python - 在附加列等于特定字符串的情况下向重复项添加后缀

node.js - Loopback 4 从数据库中发现模型

postgresql - 如何在 Linux 上使用 libpq 解析 Postgresql 中的数组列

python - 在 SQLAlchemy 的 'CheckConstraint' 中使用正则表达式

python - 让 lxml.objectify 忽略 xml namespace ?

python - 使用 Flask,我如何将 robots.txt 和 sitemap.xml 作为静态文件提供?