0

次のコードを実行していますが、エラーが発生します

import MySQLdb as mdb

source_sentence = "%Barack Obama%"
filterquery = ""
try:
    con = mdb.connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB)
    cur = con.cursor()

    print "SELECT sentence_id FROM translation_all WHERE source_sentence LIKE '%s' %s ORDER BY id" % (source_sentence, filterquery)
    cur.execute("SELECT sentence_id FROM translation_all WHERE source_sentence LIKE '%s' %s ORDER BY id", (source_sentence, filterquery))

    uid = cur.fetchone()
    print uid
except mdb.Error, e:
    print "Error %d: %s" % (e.args[0],e.args[1])
    sys.exit(1)
finally:    
    if con:    
        con.close()

エラーは次のとおりです。

SELECT sentence_id FROM translation_all WHERE source_sentence LIKE '%Barack Obama%'  ORDER BY id
Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%Barack Obama%'' '' ORDER BY id' at line 1

クエリで一重引用符を二重引用符に置き換えると、エラーは発生しませんが、空のクエリが与えられます

SELECT sentence_id FROM translation_all WHERE source_sentence LIKE "%Barack Obama%"  ORDER BY id
None

おかしなことに、上記の両方のクエリは、コマンドラインまたは phpmyadmin を介して mysql で直接実行すると結果を返します。なぜこれが失敗するのか分かりますか?

4

1 に答える 1

2

パラメータを に渡すときcur.execute、dbapi はすでに引用を行っています。つまり、使用しないでください:

... LIKE '%s' %s ORDER BY id

しかし

... LIKE %s ORDER BY id

%sここにあるのはエラーであるため、2 番目を削除したことに気付くでしょう。クエリに置き換えられ''た場合は意味がありません。

クエリを実行する前に出力される文字列に惑わされないでください。それは実行されるクエリではありません:

"... %s" % ('spam',)

次に、クエリとはまったく異なることを行います。

cursor.execute("... %s", ('spam',))
于 2013-04-11T22:32:37.043 に答える