Перейти к содержимому

Как вставить переменную в sql запрос на python

  • автор:

Передать аргументы из переменных в SQL-запрос

Таким образом не выходит. И еще подскажите, пожалуйста, в моей таблице есть поле used, в котором по умолчанию во всех записях 0 , мне нужно, чтобы запрос обновлял первую попавшуюся запись, где used равно 0 , а остальные не трогал. Благодарю!

Отслеживать
задан 1 апр 2020 в 0:05
Никита Виноградов Никита Виноградов
121 1 1 золотой знак 1 1 серебряный знак 12 12 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Для конкатенции строки с переменными вы можете использовать один из следующих вариантов:

  • Обычная конкатенция оператором +
  • Форматирования с помощью оператора %
  • Использовать метод format() для строк
  • Использовать f-строки (только для python 3)

Пример с использованием метода .format()

def insertUser(ID, AUTHOR): con = lite.connect("something.db") with con: cur = con.cursor() sql = """UPDATE someth SET used = 1, dis_name = <>, dis_id = <> WHERE used = 0 ORDER BY id ASC LIMIT 1""".format(AUTHOR, ID) cur.execute(sql) 

Для того, чтобы обновить только первую запись, необходимо использовать команду LIMIT с значением 1 вместе ORDER BY (для сортировки по ключевому полю). В примере использована колонка id (как правило, так обозначают в таблицах primary key поля). Если у вас нет такого поля, можете заменить на существующее

UPDATE:

Если вы используете sqlite, скомпилированную без объявления опции

#define SQLITE_ENABLE_UPDATE_DELETE_LIMIT 

То предыдущий код работать не будет, но вы можете реализовать аналог с помощью подзапроса:

def insertUser(ID, AUTHOR): con = lite.connect("something.db") with con: cur = con.cursor() sql = """UPDATE someth SET used = 1, dis_name = <>, dis_id = <> WHERE used = ( SELECT id FROM someth WHERE ORDER BY id ASC LIMIT 1) """.format(AUTHOR, ID) cur.execute(sql) 

Либо перекомпировать sqlite согласно инструкции с включенной опцией SQLITE_ENABLE_UPDATE_DELETE_LIMIT

Вставка переменных в SQL — запрос. Python3

Подскажите плиз, не могу вставить в SQL-запрос значение в двойных кавычках.

Сам запрос выглядит так:

SELECT family,name FROM violations WHERE processing_state = 2 LIMIT AND violations.last_edit BETWEEN "2015-11-01" AND "2015-11-02") 

Попытка вставить в проекте Python

vs = "2015-11-01" vs2 = "2015-11-02" sql=("SELECT family,name FROM violations WHERE processing_state = 2 LIMIT AND violations.last_edit BETWEEN %s AND %s") cur.execute(sql,(vs,vs2)) 

В итоге получаю ошибку вида

\'AND violations.last_edit BETWEEN \'\\"2015-11-01\\"\' AND \'\\"2015-11-02\\"\'\' at line 1'

Уже и в двойный, и в одинарные кавычки пытался заключать переменные vs и vs2, не помогает(

Для коннекта к БД Использую PyMySQL.

Другой способ соединения

Для того, чтобы выполнить любую операцию с базой данных необходимо создать объект cursor и передать SQL-выражение в объект cursor, чтобы вызвать его. В конце необходимо выполнить выполнить commit (заметьте, что commit выполняется для db объекта, а не cursor объекта)

  
In [98]:
db=sqlite3.connect('testdb') 
  
In [99]:
# Получить cursor объекта cursor = db.cursor() cursor.execute(''' DROP TABLE IF EXISTS users '''); cursor.execute(''' CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, phone TEXT, email TEXT UNIQUE, password TEXT); ''') db.commit() 

Вставка (INSERT) данных в базу данных

Для вставки данных мы используем cursor для выполнения запроса. Если требуется вставка данных из python, то можно использовать "?". Не используйте строчные операторы или конкатенацию для создания запросов, потому что это не безопасно.

  
In [100]:
cursor=db.cursor() name1 = 'Andrew' phone1 = '123232' email1 = 'user@example.com' password1 = '12345' name2 = 'John' phone2 = '234241' email2 = 'john@example.com' password2 = 'abcdef' # Insert user 1 cursor.execute('''INSERT INTO users(name, phone, email, password) VALUES(. )''', (name1, phone1, email1, password1)) print('First user inserted') # Insert user 2 cursor.execute('''INSERT INTO users(name, phone, email, password) VALUES(. )''', (name2, phone2, email2, password2)) print('Second user inserted') db.commit() 
     
First user inserted Second user inserted

Значения переменных python подставляются через кортеж. Другой способ - через словарь, используя ':'

  
In [101]:
name3 = 'Nikita' phone3 = '323232' email3 = 'nikita@example.com' password3 = '123' cursor = db.cursor() cursor.execute('''INSERT INTO users(name, phone, email, password) VALUES(:name, :phone, :email, :password)''', 'name':name3, 'phone':phone3, 'email':email3, 'password':password3>) print('Third user inserted') db.commit() 
     
Third user inserted
  
In [103]:
name3 = 'Nikita' phone3 = '323232' email3 = 'nikita@example.com' password3 = '123' cursor = db.cursor() cursor.execute('''INSERT INTO users(name, phone, email, password) VALUES(:name3, :phone3, :email3, :password3)''') print('Third user inserted') db.commit() 
     
ERROR:root:An unexpected error occurred while tokenizing input The following traceback may be corrupted or invalid The error message is: ('EOF in multi-line string', (1, 62))
--------------------------------------------------------------------------- ProgrammingError Traceback (most recent call last) in () 6 cursor = db.cursor() 7 cursor.execute('''INSERT INTO users(name, phone, email, password) ----> 8 VALUES(:name3, :phone3, :email3, :password3)''') 9 10 print('Third user inserted') ProgrammingError: Incorrect number of bindings supplied. The current statement uses 4, and there are 0 supplied.

Если вы хотите вставить нескольо пользователей в таблицу, используйте executemany и список из кортежей

  
In [104]:
name4 = 'Ann' phone4 = '490904' email4 = 'ann@example.com' password4 = '345' name5 = 'Jane' phone5 = '809908' email5 = 'jane@example.com' password5 = '785' users = [(name4, phone4, email4, password4), (name5, phone5, email5, password5)] cursor.executemany('''INSERT INTO users(name, phone, email, password) VALUES (. )''', users) db.commit() 

Если вам требуется получить ид строки, которую вы только что добавили, используйте lastrowid

  
In [46]:
id = cursor.lastrowid print('Last row id: %d' % id) 
     
Last row id: 3

Получение данных (SELECT) с SQLite

Чтобы получить данные, необходимо выполнить fetchone для выбора одной строки или fetchall для всех строк

  
In [47]:
cursor.execute('''SELECT name, email, phone FROM users''') user1 = cursor.fetchone() # получить одну строку print(user1[0]) all_rows = cursor.fetchall() for row in all_rows: # row[0] возращает первый столбец - name, row[1] - email, row[2] - phone print('  : , '.format(row[0], row[1], row[2])) 
     
Andrew John : john@example.com, 234241 Nikita : nikita@example.com, 323232 Ann : ann@example.com, 490904 Jane : jane@example.com, 809908

Как вставить переменную в sql запрос на python

У меня есть код: prepare("SELECT `Calvin` FROM `users` WHERE `login` = ? "); он работает,значение поля `Calvin`(в базе данных значение этого поля число 12) выводится.
вопрос: как вставить переменную заместо этого `Calvin`?(Допустим переменную $a = 'Calvin' ).
я пишу вот так: prepare("SELECT FROM `users` WHERE `login` = ? "); но в таком случае у меня не выводится содержимое этого поля(выводится просто 0), в отличие от кода, который я привел в начале.

этот код тоже выводит просто 0 :
prepare("SELECT ? FROM `users` WHERE `login` = ? ")
execute(array($_POST['Calvin'],$_SESSION['user']));

Лучший ответ

> Допустим переменную $a = 'Calvin'
строго говоря, лучше $a = '`Calvin`', но вроде бы и без кавычек должно пройти, хз зачем их всегда пишут
> prepare("SELECT < $a >FROM `users` WHERE `login` = ? ");
string interpolation не работает, когда есть пробелы внутри скобок
надо SELECT FROM .
(блин, майлру их сам доставляет, ну в общем после < и перед >)
> execute(array($_POST['Calvin'],$_SESSION['user']));
у тебя $_POST['Calvin'] == 'Calvin'? в общем-то он просто строку подставит вместо имени поля, поэтому у тебя в выводе будет строка "Calvin", мб 0 уже при попытке распарсить число получается или типа того, хз как это в пыхе работает

ну и вообще если тебе так приходится делать, то есть подозрения, что ты неправильно спроектировал свою БД

who I amУченик (196) 1 год назад

да,проблема в пробеле была. спасибо,помог)
> у тебя $_POST['Calvin'] == 'Calvin'? в общем-то он просто строку подставит вместо имени поля, поэтому у тебя в выводе будет строка "Calvin", мб 0 уже при попытке распарсить число
да, там просто Calvin выводится я ошибся немного.
а вот почему он просто строку вместо имени подставит это конечно интересно, этого я не понимаю, ни в одной книге из тех, которые я читал про это не говорилось.

user49913 Просветленный (38243) потому что так работают prepared statement-ы они же не могут отличить, строку ты туда хотел подставить или имя столбца, поэтому подставляют строку ну и вообще, как я уже сказал, пользовательский ввод не должен влиять на структуру запроса, только на значения в нём наверняка твою бд и/или программу можно перепроектировать так, чтобы к таким хакам прибегать не приходилось

Остальные ответы

у тебя первый "вопрос", т. е. placeholder в твоём запросе заменяется первым элементом массива. Ты уверен, что $_POST['Calvin'] содержит название столбца в таблице в БД?
Смотри, запрос у тебя составлен так:
SELECT? FROM `users`

т. е. вместо "?" - должно быть название столбца. Например, "name", да?
т. е. весь запрос должен примерно выглядеть как:
"Select name FROM `users` WHERE `login` = ? "
так вот, я почему-то уверен, что массив, который ты скармливаешь функции Execute в первом своём элементе содержит нифига не название колонки в таблице..

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *