【问题标题】:Adding a PDF to a sqlalchemy database将 PDF 添加到 sqlalchemy 数据库
【发布时间】:2020-09-22 12:38:12
【问题描述】:

我有一个简单的 model,我想将 PDF 文件的二进制内容存储在 data 属性中:

from app import db

    class Model(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        data = db.Column(db.PickleType, nullable=True)

我正在尝试将一些任意 PDF 文件添加到 data 属性,如下所示:

@app.route('/')
def index() -> str:
    model = Model.query.get(1)
    model.data = open('./app/static/pdf/file.pdf', 'rb')
    db.session.commit()
    return ''

但我收到以下错误:

sqlalchemy.exc.StatementError: (builtins.TypeError) cannot serialize '_io.BufferedReader' object
[SQL: UPDATE model SET data=? WHERE model.id = ?]
[parameters: [{'data': <_io.BufferedReader name='./app/static/pdf/file.pdf'>, 'model_id': 1}]]

请问这样做的正确方法是什么?我应该如何序列化 PDF 文件?

感谢您的帮助:-)

【问题讨论】:

    标签: python pdf flask sqlalchemy


    【解决方案1】:

    两者的区别

    model.data = open('./app/static/pdf/file.pdf', 'rb')
    

    model.data = open('./app/static/pdf/file.pdf', 'rb').read()
    

    是腌制文件句柄(有一些不可腌制的部分)和腌制字节数组之间的区别。

    【讨论】:

    • 在你的立场上,我会考虑 PickleType 是否增加了任何价值。一个字节数组可以很好地存储在一个普通的 BLOB 中。
    • 太棒了,所以改用db.Column(db.LargeBinary, nullable=True)
    • 是的。您可能需要设置length,具体取决于您使用的数据库。文档中有关于 MySQL 的提示。
    猜你喜欢
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 2019-03-30
    相关资源
    最近更新 更多