Как использовать параметры SQL с python?

Я использую Python 2.7 и pymssql 1.9.908.

В .net для запроса базы данных я бы сделал что-то вроде этого:

using (SqlCommand com = new SqlCommand("select * from Customer where CustomerId = @CustomerId", connection))
{
    com.Parameters.AddWithValue("@CustomerID", CustomerID);
    //Do something with the command
}

Я пытаюсь выяснить, что эквивалентно для python и, в частности, для pymssql. Я понимаю, что мог бы просто выполнить форматирование строки, однако это, похоже, не справляется с экранированием должным образом, как это делает параметр (я могу ошибаться в этом).

Как мне это сделать в питоне?


person Jason Webb    schedule 04.08.2010    source источник
comment
Отличный вопрос и ответы. Кто-нибудь знает, как использовать параметры NAMED, подобные Джейсону выше. До сих пор я мог использовать только %s, %d тип материала (позиционный).   -  person Michael Kennedy    schedule 05.12.2013


Ответы (1)


После создания объекта подключения db:

cursor = db.execute('SELECT * FROM Customer WHERE CustomerID = %s', [customer_id])

затем используйте любой из методов fetch... полученного объекта cursor.

Не дайте себя одурачить частью %s: это НЕ форматирование строки, это подстановка параметров (разные модули API БД используют разный синтаксис для подстановки параметров — pymssql просто использует неудачный %s!-).

person Alex Martelli    schedule 05.08.2010
comment
Спасибо. Синтаксис %s сбивал меня с толку. - person Jason Webb; 05.08.2010
comment
@ Джейсон, пожалуйста - и возможная путаница именно поэтому я называю этот синтаксис для параметров API БД неудачным (хотя, увы, многие популярные модули API БД используют его). - person Alex Martelli; 05.08.2010
comment
К черту этот вводящий в заблуждение синтаксис %s! Я только что потратил час, пытаясь понять, почему мой код жаловался на попытку использовать %d для указания параметра int. Меня заставили подумать, что здесь используется форматирование Python. - person Passiday; 05.10.2013
comment
Обратите внимание, что последний pymssql на python3 не любит [customer_id], ему нужен кортеж (customer_id,) - person Perkins; 30.03.2016