Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 25, 2014 17:39:04

gshalx
Зарегистрирован: 2014-06-22
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Переменные в запросах

Проблема с переменными ,

ert = [11,12]
import sqlite3
con = sqlite3.connect("tdb.db")
c = con.cursor()
c.execute('''create table if not exists bug (id integer primary key, debeti, krediti)''')
c.execute('''insert into bug (debeti, krediti)values ('BUY54','fff';''')
con.commit()
con.close()
хотел бы вместо “fff” вставить переменную
ert[0]
, посоветуйте пожалуйста как

Отредактировано gshalx (Июнь 25, 2014 17:40:52)

Офлайн

#2 Июнь 25, 2014 17:41:56

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Переменные в запросах

c.execute('''insert into bug (debeti, krediti)values ('BUY54','fff';''')
мб
c.execute('''insert into bug (debeti, krediti)values ('BUY54','fff');''')
http://lmgtfy.com/?q=python+string+interpolation

Отредактировано Singularity (Июнь 25, 2014 17:44:09)

Офлайн

#3 Июнь 25, 2014 19:05:57

john123
Зарегистрирован: 2013-12-22
Сообщения: 56
Репутация: +  7  -
Профиль   Отправить e-mail  

Переменные в запросах

Если я правильно понял вопрос, то Вам нужна обычная подстановка параметров. Воспользуйтесь такой штукой:

c.execute("insert into bug (debeti, krediti)values ('BUY54', ?)", (err[0],))

или используя именованные параметры:
c.execute("insert into bug (debeti, krediti)values ('BUY54', :my_param)", {"my_param": err[0],})

В документации к функции execute(), кстати, это описано: https://docs.python.org/2/library/sqlite3.html#sqlite3.Cursor.execute

А вот методом string interpolation, указанным выше, пользоваться при работе с БД не рекомендуется, во избежании возникновения возможности проведения атак типа SQL-injection.

Отредактировано john123 (Июнь 25, 2014 21:29:03)

Офлайн

#4 Июнь 26, 2014 07:57:03

gshalx
Зарегистрирован: 2014-06-22
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Переменные в запросах

c.execute("insert into bug (debeti, krediti)values ('BUY54', :my_param)", {"my_param": err[0],})

Код работает на отлично , No никак не пойму почему и как , хотелось бы иметь документацию на русском

Офлайн

#5 Июнь 26, 2014 11:27:05

john123
Зарегистрирован: 2013-12-22
Сообщения: 56
Репутация: +  7  -
Профиль   Отправить e-mail  

Переменные в запросах

К сожалению могу предложить разве что только Google Translate:
https://translate.google.ru/translate?sl=en&tl=ru&js=y&prev=_t&hl=ru&ie=UTF-8&u=https%3A%2F%2Fdocs.python.org%2F2%2Flibrary%2Fsqlite3.html&edit-text=

На русском языке переводов оффициальной документации не встречал.
А что именно не понятно?

Офлайн

#6 Июнь 26, 2014 13:34:14

gshalx
Зарегистрирован: 2014-06-22
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Переменные в запросах

Знак “?” и “:my_парам” , почему нельзя вставить именно переменную

Офлайн

#7 Июнь 26, 2014 13:38:37

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Переменные в запросах

gshalx
почему нельзя вставить именно переменную
Потому что чаще всего эти параметры получаются от пользователя в гет/пост запросах.



Офлайн

#8 Июнь 26, 2014 17:07:10

john123
Зарегистрирован: 2013-12-22
Сообщения: 56
Репутация: +  7  -
Профиль   Отправить e-mail  

Переменные в запросах

Создается ощущение, что Вы пытаетесь изучать Python, сравнивая его с другими языками. Если да, то с каким языком сравниваете? PHP?

Если с PHP, то можно объяснить так:
в PHP подстановка переменных в строку осуществляется так:

$var = 1;
$string = "My string. Variable: $var".
После этого интерпретатор PHP, когда натыкается при выполнени кода на такую запись, подставляет заместо $var значение этой переменной.

В Python же, разработчик языка пошел другим путем (хотя напомню, что Python старше, чем PHP).

Подстановка переменной тут осуществляется так (старый вариант):
var = 1
string = "My string. Variable: %d" % var
Либо так (начиная с Python 2.6 и далее):
var = 1
string = "My string. Variable: {}".format(var)

Причем второй вариант более “навороченный”, с поддержкой многих возможностей, про которые стоит почитать в документации: https://docs.python.org/2/library/string.html#formatexamples (напомню, что в Python строки являются объектами. Так вот у строки можно вызвать этот самый метод format(). Т.е. “My string. Variable: {}”.format(…) можно представить как str.format()).

Каких-то других вариантов подстановки переменных в строку в Python нет, т.е. синтаксис подстановки переменных прямо в строку, как в PHP, в Python просто не предусмотрен. От этого отказался сам разработчик языка.

А при работе с базами данных эти методы использовать не рекомендуется, потому что в модулях, реализующих интерфейс к базам данных (например модуль sqlite3), обычно функционал подстановки значений переменных в строки реализован по-своему. Это позволяет добиться безопасной работы с БД.
Т.е. подстановка параметров в функции cursor.execute() (sqlite3) не является системной функцией, модуль sqlite3 просто предоставляет такую возможность (и рекомендует), но не запрещает Вам пользоваться стандартными функциями для подстановки.

Отредактировано john123 (Июнь 26, 2014 17:27:05)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version