2014-10-17 76 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