2014-10-17 75 views
0

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

我需要使用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天解决这个任务没有运气。 :( 请帮帮忙!

回答

0

我不知道为什么你的第二个例子工程,鉴于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',)) 

,但我不知道这会传递参数给存储过程的工作。

+0

它接缝db._adapter.cursor.callproc(...)做了从3的技巧。谢谢! – RawBits 2014-10-18 15:30:32

+0

在你的问题中,你指出'db.cursor()。execute(“CALL someproc('”+ f +'');“)''工作。在那个代码中,'db'是一个'MySQLdb'连接对象吗?如果是这样,我会希望'db._adapter.cursor.execute(“CALL someproc('”+ f +'');“)'也能够工作,因为它最终会调用cursor()。execute()'。 – Anthony 2014-10-18 17:22:53

+0

对我来说它是一个python字符串处理问题。我认为直接通过DAL使用光标是一样的,但不知道它是什么。 – RawBits 2014-10-20 08:59:20