明らかな何かが欠けている可能性がありますが、MySQLdb のオンライン ドキュメントにあるさまざまな例と私のコードがどのように異なるのかわかりません。
私はPythonのプログラミングにかなり慣れていませんが、perlの経験が豊富です。私がやろうとしていることは、早い段階で特定の良い習慣を身につけることです (perl のように、私は常に「厳格な使用; 警告を使用する」から始めます)。そのため、再利用可能な関数を独立したファイル ( funct.py) を使用して、後で時間を節約できます。
テーブルからランダムな行を選択するための次の関数があります。
def returnRandom(conn,countcol,table,field):
cursor = conn.cursor()
cursor.execute('SELECT MAX(%s) FROM %s',(countcol,table))
maxRow = cursor.fetchone()[0]
cursor.execute("SELECT MIN(%s) FROM %s",(countcol,table))
minRow = cursor.fetchone()[0]
randomId = random.randrange(minRow,maxRow+1,1)
cursor.execute("SELECT ? FROM ? WHERE id >=? LIMIT 1",field,table,randomId)
return cursor.fetchone()[0]
次のように呼び出されます。
msg = funct.returnRandom(conn,"id","testtable","data")
残念ながら、次のエラーが発生します: _mysql_exceptions.ProgrammingError: (1064, "SQL 構文にエラーがあります。1 行目の ''testtable'' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください")
実行行の %s の代わりに testtable を配置すると、クエリは実行されますが、実行されているように見えます
SELECT MAX('id') FROM testtable;
もちろん「id」を返します。
これらの両方を考えると、実行しようとすると %s エントリを引用しているように見えます。それをやめる方法、または私が達成しようとしていることを実際にどのように行うべきかを誰かが説明できるかどうか疑問に思っていましたか? 関数をできるだけ汎用的にしたいので、呼び出されたときに渡されるデータに依存しています。
編集: ? に置き換えると、追加する必要があります マーク:
....
cursor.execute('SELECT MAX(?) FROM ?',(countcol,table))
File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 151, in execute
query = query % db.literal(args)
TypeError: not all arguments converted during string formatting