【问题标题】:Save BLOB into MySQL using web2py使用 web2py 将 BLOB 保存到 MySQL
【发布时间】:2014-12-13 08:48:24
【问题描述】:

使用 web2py 框架,我想通过文件类型输入选择文件并将其内容保存到 MySQL BLOB 类型字段中。该文件包含二进制数据。

我需要使用 DAL 进行连接管理,但我有一个 SQL 过程来完成这项任务。问题是当我在下面尝试这个时,我得到了 SQL 语法错误。

f = form.vars.element.file.read()
db.executesql( "CALL someproc('" + f + "');" )

我尝试以多种方式插入原始二进制文件并得到相同或相似的错误。我也尝试过直接使用 MySQLdb:

f = form.vars.element.file.read()
db.cursor().execute( "CALL someproc('" + f + "');" )
db.commit()

这很好用,但我需要使用上面的 DAL 版本,所以问题仍然存在。

我花了 3 天时间解决了这个任务,但没有运气。 :( 请帮忙!

【问题讨论】:

    标签: python mysql blob web2py data-access-layer


    【解决方案1】:

    鉴于DAL.executesql 方法最终以完全相同的方式调用cursor().execute(),我不确定您的第二个示例为何有效。在任何情况下,如果您想将后一种语法与 web2py DAL 对象结合使用,您可以通过 db._adaptor.cursor 访问游标。因此,您的第二个示例将更改为:

    db = DAL('mysql://...')
    db._adapter.cursor.execute( "CALL someproc('" + f + "');" )
    

    另一种选择可能是使用.callproc 方法:

    db._adapter.cursor.callproc('someproc', (f, ))
    

    注意,db.executesql() 也有占位符:

    db.executesql('...WHERE name=%s', ('Mary', ))
    

    但我不确定这是否适用于将参数传递给存储过程。

    【讨论】:

    • 它接缝 db._adapter.cursor.callproc(...) 从 3 中起到了作用。谢谢!
    • 在您的问题中,您表示db.cursor().execute( "CALL someproc('" + f + "');" ) 有效。在该代码中,dbMySQLdb 连接对象吗?如果是这样,我希望db._adapter.cursor.execute( "CALL someproc('" + f + "');" ) 也能正常工作,因为它最终会调用cursor().execute()
    • 对我来说,这似乎是一个 python 字符串处理问题。我认为直接通过 DAL 使用光标是一样的,但不知何故不是。
    • 嗯,如您所见heredb._adapter.cursorconnection.cursor() 返回的对象,因此在其中一个上调用.execute() 应该会产生相同的结果。无论如何,我很高兴替代方案对您有用。
    猜你喜欢
    • 2015-02-07
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2021-08-22
    相关资源
    最近更新 更多