MySQLdb: двойные кавычки передаются в запрос - PullRequest
1 голос
/ 13 марта 2012

Я схожу с ума от 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''

Как мне изменить двойную кавычку на одну?

Я пробовал следующее:

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

Но ничего не работает: (

Ответы [ 2 ]

4 голосов
/ 13 марта 2012

Вы не можете параметризовать имя таблицы, поэтому вам нужно выполнить его санитарную очистку и использовать вместо этого подстановку строк в запросе.

Кому очистить имя таблицы в запросе с несколькими параметрами:

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

Если вы попытаетесь передать имя таблицы без его очистки, вы получите синтаксическую ошибку.

4 голосов
/ 13 марта 2012
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)
...