質問

私はmysqldbで怒っています!私は正式な文書を正確に追いかけていますが、コードにエラーが発生しました:

DB_TABLE = "test"
cursor.execute("SELECT MAX(id) AS maxid FROM " + DB_TABLE)
print "***"
cursor.execute("SELECT MAX(id) AS maxid FROM %s" , (DB_TABLE,))
.

エラーを得ます:

Traceback (most recent call last):
  File "dbscript.py", line 49, in <module>
    cursor.execute("SELECT MAX(id) AS maxid FROM %s" , (DB_TABLE,))
  File "build/bdist.macosx-10.7-intel/egg/MySQLdb/cursors.py", line 174, in execute
  File "build/bdist.macosx-10.7-intel/egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
_mysql_exceptions.ProgrammingError: (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 ''test'' at line 1")
.

明らかにいくつかの引用符に問題があります。MySQLにこのような行を送信するようです。

SELECT MAX(id) AS maxid FROM ''test''
.

単一のもので二重引用符を変更することができますか?

I'Vは以下を試した:

DB_TABLE = 'test'
cursor.execute("SELECT MAX(id) AS maxid FROM %s" , [DB_TABLE])
cursor.execute("SELECT MAX(id) AS maxid FROM %s" , ("test",))
.

しかし何も機能しません:(

役に立ちましたか?

解決

cursor.execute("SELECT MAX(id) AS maxid FROM %s" , ("test",)) 
.

および同様のステートメントでは、cursor.executeはSQLパラメータを%sに置き換えます。

あなたが必要とするものはこのようなものです

sql = "SELECT MAX(id) AS maxid FROM %s" % ("test", )
cursor.execute(sql)
.

他のヒント

パラメータ化されたテーブル名はできませんので、あなたはそれを自分自身を消毒し、代わりにクエリ内で文字列置換を使用する必要があります。

複数のパラメータを持つクエリ内のテーブル名をサニタイズ

query = "SELECT * FROM %s WHERE columnName = %s" % (tableName,'%s')
print(query)
.

この時点で、クエリは次のように表示されます。

SELECT * FROM tableName WHERE columName = %s
.

カーソルを作成したら、パラメータ化された条件を使用します。

cursor.execute(query,(columnValue,))
.

MySQLが読み込まれる実際のクエリは次のとおりです。

SELECT * FROM tableName WHERE columnName = columnValue
.

サニタイズせずにテーブル名を渡しようとすると、構文エラーが発生します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top