Строковые литералы Python SQL DB и экранирование - PullRequest
2 голосов
/ 16 ноября 2010

Кто-нибудь знает, будет ли MySQLdb автоматически экранировать строковые литералы для операторов SQL?

Например, я пытаюсь выполнить следующее:

cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = 'Blah'""")

Будет ли это экранировать имя учетной записи автоматически?Или он уйдет, только если я сделаю следующее?

1007

Или для обоих?Может кто-нибудь уточнить это, поскольку я не могу найти какую-либо информацию об этом.

Ответы [ 2 ]

2 голосов
/ 16 ноября 2010

В первом примере экранирования нет, это необработанный запрос SQL.Это верно, это будет работать, но, очевидно, это имеет смысл, только если вы всегда хотите искать учетную запись Blah.

Когда вам нужно получить учетную запись по имени в переменной, вам потребуетсяпараметризованная версия.Однако ваш пример может не работать должным образом, так как (x) не кортеж, это просто значение x.x в последовательности кортежей будет (x,).Во избежание путаницы вы можете предпочесть использовать список [x].

1 голос
/ 16 ноября 2010

Экранирование выполняется только тогда, когда вы передаете запрос и данные в MySQLdb отдельно. Вот как он знает, что бежать. : -)

Таким образом, выйдет только ваш второй пример:

x = ('Blah',)
cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = %s""", x)

Обратите внимание, как я изменил x на tuple. Это то, что ожидает MySQLdb. Это имеет смысл, поскольку вам может потребоваться передать несколько переменных. Как:

x = ('Blah','Foo23')
cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = %s OR `account_code` = %s""", x)

Дайте мне знать, если это ответит на ваш вопрос.

Удачи. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...