1

クエリ文字列を作成しています。

query = "SELECT seqid, date, name, steamid, team, text, type, '%s' as triggerword, '%s' as weight FROM chatlogs WHERE date > '%s' AND text LIKE '%%%s%%' ORDER BY DATE" % (word, weight, self.setting['LAST_RUN_TIME'], word)

文字列を出力すると、正しく返されます。

SELECT seqid, date, name, steamid, team, text, type, 'hunting_term' as triggerword, '0.01' as weight FROM chatlogs WHERE date > '2012-04-18 23:47:58.439124' AND text LIKE '%hunting_term%' ORDER BY DATE

ただし、TypeError 例外で失敗します: TypeError: フォーマット文字列の引数が不足しています

完全なコード:

import database

mysqldb = database.Connection('localhost','mydb',user='myuser',password='mypass')

word = 'hunting_term'
weight = 0.01
setting = dict({'LAST_RUN_TIME':'2012-04-18 23:47:58.439124'})

query = "SELECT seqid, date, name, steamid, team, text, type, '%s' as triggerword, '%s' as weight FROM chatlogs WHERE date > '%s' AND text LIKE '%%%s%%' ORDER BY DATE" % (word, weight, setting['LAST_RUN_TIME'], word)
print query

for message in mysqldb.query(query):        # This is the line it throws the exception on
    print "A row"

データベースはtornadoパッケージからのものです

4

1 に答える 1

6

ここでの問題は、MySQLdb への最終的な呼び出しが次のようになることです。

query = "SELECT seqid, date, name, steamid, team, text, type, 'hunting_term' as triggerword, '0.01' as weight FROM chatlogs WHERE date > '2012-04-18 23:47:58.439124' AND text LIKE '%hunting_term%' ORDER BY DATE"
db.cursor().execute(query, ())

の最初の引数db.cursor().execute()はフォーマット文字列である必要があり、2 番目の引数はそのフォーマット文字列の置換である必要があります。これはMySQLdb docsで確認できます。つまり、次のコードを実行します。

query % ()

ご覧のとおり、これにより同じ TypeError が発生します。

>>> query % ()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string

これは、%MySQL に表示させたいリテラルは、 に表示される%%ときに である必要があることを意味しますdb.cursor().execute()。そのため、元のフォーマット文字列を次のように変更することで、これを修正できるはずです。

query = "SELECT seqid, date, name, steamid, team, text, type, '%s' as triggerword, '%s' as weight FROM chatlogs WHERE date > '%s' AND text LIKE '%%%%%s%%%%' ORDER BY DATE" % (word, weight, self.setting['LAST_RUN_TIME'], word)

ただし、これを行う正しい方法は、MySQLdb に置換を実行させることです。これにより、コードが次のように変更されます。

query = "SELECT seqid, date, name, steamid, team, text, type, %s as triggerword, %s as weight FROM chatlogs WHERE date > %s AND text LIKE %s ORDER BY DATE"
parameters = (word, weight, setting['LAST_RUN_TIME'], '%%%s%%' % word)
for message in mysqldb.query(query, *parameters):
    print "A row"
于 2012-04-19T17:36:54.907 に答える