使用 web2py 将 BLOB 保存到 MySQL

Posted

技术标签:

【中文标题】使用 web2py 将 BLOB 保存到 MySQL【英文标题】:Save BLOB into MySQL using web2py 【发布时间】: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 天时间解决了这个任务,但没有运气。 :( 请帮忙!

【问题讨论】:

【参考方案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 使用光标是一样的,但不知何故不是。 嗯,如您所见here,db._adapter.cursorconnection.cursor() 返回的对象,因此在其中一个上调用.execute() 应该会产生相同的结果。无论如何,我很高兴替代方案对您有用。

以上是关于使用 web2py 将 BLOB 保存到 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

使用 Chilkat 和 SQL Server 将单个电子邮件附件保存到 BLOB

如何将Java中的图片保存到多个blob中?

如何在 Web2py 中使用 jquery 将数据从视图传输到控制器操作函数

将文件保存到 Azure Blob 存储的奇怪行为

如何将您安装的变压器保存到 blob 中,以便您的预测管道可以在 AML 服务中使用它?

将 javascript 图像 blob 保存到 ASP.NET Core 控制器