@nik19

VALUES(?) как работает в Sqlite3/Python?

Не могу разобраться как использовать переменные в запросах к БД Sqlite3 в Python3. Можно ли использовать конструкции с VALUES(?) после FROM (когда имя таблицы берется из переменной), и после WHERE (когда в условиях сравниваются переменные со значениями столбцов). В INSERT INTO - работает, просто вставляет значения столбцов. А в данном простом запросе выборки с условием никак. Не хочется верить, что это не реализовано.
ПРИМЕР:
table1 = "days"
yr="2022"
d="1"
m="1"

cur.execute("""SELECT ym1, ym2 FROM (VALUES(?)) WHERE (year = VALUES(?)) AND (month = VALUES(?)) AND (day = VALUES(?));""", (table1, yr, d, m))


Ошибка:
sqlite3.OperationalError: near "VALUES": syntax error
  • Вопрос задан
  • 1144 просмотра
Решения вопроса 1
@nik19 Автор вопроса
Пока удалось подставлять переменные после WHERE.
SELECT ym1, ym2 FROM tablename WHERE (year = ?) AND (month = ?) AND (day = ?);""", (table1, yr, d, m)
А вот имя таблицы после FROM никак не удается, ни ?, ни VALUES(?).

P.S. кроме формирования запроса в виде строки, и дальнейшего использования как
cur.execute(sqlselect)
нашелся приемлемый вариант с использованием f-строк. Гораздо универсальнее "?" и всяких VALUES
table1 = "days"
yr="2022"
d="1"
m="1"

cur.execute(
  f"SELECT ym1, ym2 FROM {table1} WHERE year = ? AND month = ? AND day = ?;", 
  (table1, yr, d, m)
)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
1. VALUES - это часть синтаксиса SQL, точнее запроса INSERT, а не питоновской обертки sqlite3. Твой запрос синтаксически некорректен. Обёртка позволяет только заменить токен ? на переданное значение.
2. Насколько я знаю, нельзя, так как подстановка значений умеет вставлять только константы - числа и строки. Можно (только осторожно) использовать обычное форматирование строк. Но вообще если ты наткнулся на такую задачу, стоит остановиться и переспросить себя: нельзя ли добиться того же самого результата по-другому? Потому что в динамическом формировании SQL запросов легко напортачить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы