2012-07-25 25 views
0

我有一個url,我想使用django提供的「光標」工具保存到MySQL數據庫中,但我一直收到「格式字符串沒有足夠的參數」錯誤,因爲此網址包含一些轉義字符(非ASCII字符)。測試代碼非常簡短:使用django光標來保存轉義字符的錯誤

test.py

import os 
import runconfig #configuration file 
os.environ['DJANGO_SETTINGS_MODULE'] = runconfig.django_settings_module 
from django.db import connection,transaction 
c = connection.cursor() 
url = "http://www.academicjournals.org/ijps/PDF/pdf2011/18mar/G%C3%B3mez-Berb%C3%ADs et al.pdf" 

dbquery = "INSERT INTO main_crawl_document SET url="+url 
c.execute(dbquery) 
transaction.commit_unless_managed() 

完整的錯誤消息是

Traceback (most recent call last): 
    File "./test.py", line 14, in <module> 
    c.execute(dbquery) 
    File "/usr/local/lib/python2.6/site-packages/django/db/backends/util.py", line 38, in execute 
    sql = self.db.ops.last_executed_query(self.cursor, sql, params) 
    File "/usr/local/lib/python2.6/site-packages/django/db/backends/__init__.py", line 505, in last_executed_query 
    return smart_unicode(sql) % u_params 
TypeError: not enough arguments for format string 

任何人可以幫助我嗎?

回答

1

你正打開自己的SQL注入。相反,使用c.execute()正確:

url = "http://www.academicjournals.org/ijps/PDF/pdf2011/18mar/G%C3%B3mez-Berb%C3%ADs et al.pdf" 
dbquery = "INSERT INTO main_crawl_document SET url=?" 
c.execute(dbquery, (url,)) 
transaction.commit_unless_managed() 

.execute方法應該接受的參數使用轉義的迭代,假設它是正常的DBAPI方法(它應該是和Django)。

+0

感謝您的回覆。我在玩你的方法,但是我應該使用什麼佔位符作爲「NULL」值?對於一個字符串,它應該是「%s」(除「?」)。謝謝。 – fanchyna 2012-07-27 13:37:57

+0

@fanchyna如果在'.execute'的第二個參數的迭代器中給出'None',它應該在查詢中填充NULL。 – 2012-07-27 19:01:49

+0

使用c.execute(命令,參數)可解決轉義字符問題。謝謝! – fanchyna 2012-07-30 15:41:09