【问题标题】:How to store a file in DB with pyramid and SQLAlchemy如何使用金字塔和 SQLAlchemy 将文件存储在数据库中
【发布时间】:2023-04-02 22:35:01
【问题描述】:

我有一个 Pyramid Web 应用程序,我需要使用 SQLAlchemy 将上传的文件存储到 postgresql 数据库。我已经通过带有FormData 对象的 AJAX 调用访问该文件并保存在一个变量中,但我无法将它存储到 SQLAlchemy 模型中。

我尝试过使用类似ControlFile.content = file_object.file 的方法,但出现以下错误:can't escape _io.BytesIO to binary

这是我的代码 sn-ps

数据库

CREATE TABLE "control_file"(
--  ...
    "content" bytea NOT NULL
--  ...
);

SQLAlchemy

class ControlFile(BaseStatusAll):
    __tablename__ = 'control_file'
    content = Column(LargeBinary)
    #...

金字塔

@view_config(route_name='add_file_to_control', renderer='json', request_method='POST')
def add_file(request):
    file_object = request.params.get('file')
    cf = ControlFile()
    cf.content = file_object.file
    # SQLAlchemy session
    request.dbsession.add(cf)
    #...
    return {'status': 1}

JS

这是我用来上传文件的脚本。注意file 是一个File 对象(https://developer.mozilla.org/en-US/docs/Web/API/File

var fd = new FormData();
fd.append("file", file);
$.ajax({
    'url': '...',
    'method':'POST',
    'async': false,
    cache: false,
    contentType: false,
    processData: false,
    data: fd
});

【问题讨论】:

    标签: python postgresql sqlalchemy pyramid


    【解决方案1】:

    这是一种解决方法,但我确信必须有更好的方法来做到这一点。

    所以,总的来说,我所做的是

    1. 访问对象的文件属性,字节字符串所在的位置
    2. 使用shutil 和字节字符串创建一个临时文件
    3. 读取临时文件并将其内容设置为 SQLAlchemy 模型的属性
    4. 保存对象
    5. 删除临时文件
    import shutil
    # 1
    cf = ControlFile()
    request_file = file_object.file
    
    # 2
    with open('temp/' + file_object.filename, 'wb') as output_file:
        shutil.copyfileobj(request_file, output_file)
    
    # 3
    with open('temp/' + file_object.filename, 'rb') as file:
        cf.content = file.read()
    
    # 4
    # SQLAlchemy session
    request.dbsession.add(cf)
    
    # 5
    os.remove('temp/' + file_object.filename)
    

    【讨论】:

    • 这应该可以吗?应该可以直接在 file_object.file 对象上调用 read() 吗? cf = ControlFile()cf.content = file_object .file.read()request.dbsession.add(cf)
    猜你喜欢
    • 2013-11-23
    • 2013-10-13
    • 2013-11-09
    • 2021-04-10
    • 2014-04-20
    • 2017-01-17
    • 2012-09-18
    • 2018-10-21
    • 1970-01-01
    相关资源
    最近更新 更多