2016-02-23 4 views
1

выполнения этого кода на Python 2.7.10 [GCC 5.2.1 20151010] на linux2MySQLdb: ошибка с Select/выполнить/escape_string

import flask 
from MySQLdb import escape_string as thwart 
username="abc" 

conn = MySQLdb.connect(host="localhost",user="root", passwd="xxxxxxx", db="pythonprogramming") 
c  = conn.cursor() 
x  = c.execute("SELECT * FROM users WHERE username = (%s)", (thwart(username))) 

Я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
File "", line 1, in TypeError: must be impossible, not str 

это версия MySQL на моем компьютере

+-------------------------+------------------------------+ 
| Variable_name | Value 

+-------------------------+------------------------------+ 
| innodb_version | 5.7.11 

| protocol_version | 10 

| slave_type_conversions | 

| tls_version | TLSv1,TLSv1.1 

| version | 5.7.11 

| version_comment | MySQL Community Server (GPL) | 
| version_compile_machine | x86_64 

| version_compile_os | Linux 

+-------------------------+------------------------------+ 
+0

код выше питон ---- Импорт MySQLDb – Yajnas

+0

Является ли _import flask_ необходимым для воспроизведения проблемы? Попробуйте снять все ненужные коды (и не связанные теги). И попробуйте удалить всю ненужную сложность. Нужно ли удалять 'escape_string' для' thwart'? – hagello

+0

'escape_string', кажется, очень важно здесь, но в заголовке есть только« thwart », что звучит довольно случайно для меня. Ваш вопрос будет трудно найти, как есть. – hagello

ответ

0

Вы знаете об опасности внедрения SQL. Это хорошо.

Вы даже используете очень надежную форму: execute: с параметризованным запросом). Когда вы делаете свой запрос таким образом, вам не нужно бежать вообще. execute все делает для вас. Таким образом, решение:

x  = c.execute("SELECT * FROM users WHERE username = % 

s», (имя пользователя))

Вы нуждались бы избежать, если вы сделали что-то вроде этого (с необходимым import):

x  = c.execute("SELECT * FROM users WHERE username = %s" % escape_string(username)) 

Для дальнейшего обсуждение, посмотрите на Python MySQL Parameterized Queries

+0

>>> import MySQLdb
>>> from MySQLdb import escape_string
>>> conn = MySQLdb.connect (host = "localhost", user = "root", passwd = "samsam", db = "pythonprogramming")
>>> с = conn.cursor()
>>> имя пользователя = "ABC"
>>> х = c.execute ("SELECT * FROM пользователей, где имя пользователя = (% s)" % escape_string (имя пользователя))

...все еще получаю ошибку

Traceback (самый последний вызов последнего): Файл "", строка 1, в
TypeError: должно быть невозможно <плохой формат символ>, не ул
>>>
Yajnas

+0

К сожалению, параметры должны быть переданы как кортеж (или хеш, если вы используете «% (имя) s»). Ред. – hagello

1

Код ниже работал для меня, а переменная запроса x возвратила «1L»

`param1="john" 
x = c.execute("""SELECT * FROM users WHERE username = %s """, (param1,)) 
` 

хотя я не совсем понимаю, почему следующий код ниже не работает

param1="john" 
x = c.execute("""SELECT * FROM users WHERE username = %s """ % (param1,)) 

и

param1="john" 
x = c.execute("""SELECT * FROM users WHERE username = %s """ , (param1)) 
+0

1L - это число 1 как длинное целое число. Кажется, это размер набора результатов. Вероятно, драйвер базы данных обычно использует long, потому что размер результирующего набора _could_ превышает диапазон целого числа. – hagello

+0

Ваша вторая попытка равна 'x = c.execute (" "" SELECT * FROM users WHERE username = ("john",) "" ") '. Нормальная интерполяция строк. – hagello

+0

Что касается вашей третьей попытки: выполнить нужно кортеж или хэш значений. Простое размещение круглых скобок вокруг одного значения делает _not_ создание кортежа. Вам нужна дополнительная запятая. – hagello

Смежные вопросы