0

django が提供する「カーソル」ツールを使用して MySQL データベースに保存したい URL がありますが、この URL にはエスケープされた文字 (ASCII 以外の文字) が含まれているため、「フォーマット文字列の引数が不足しています」というエラーが表示され続けます。 . テスト コードはかなり短いです。

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

誰でも私を助けることができますか?

4

1 に答える 1

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 の場合) であると仮定して、エスケープに使用する反復可能なパラメーターを受け入れる必要があります。

于 2012-07-25T21:45:54.340 に答える