Задать вопрос
@Bombesko
Чайник

Как тут сделать insert?

Всем привет! Использую python+firebird. Хочу создать новую запись в таблице
image.png
В таблице есть тригер на генерацию ID и даты:
AS
BEGIN
 if(new.id is null) then new.id=gen_id(d_gen_commands,1);
 new.datetime="now";
 post_event "d_new_command";
END

---------------------

cur.execute(f"insert into d_commands values {(num, date_and_time, 1, 'open_door,0', -1062731554)}")


Мой код выше полностью работает, но мне надо не 5 значений вписывать, а только 3 из них.

И вот моё решение:

cur.execute(f"insert into d_commands (executor, text, phis_addr) values ({int(1)}, {str(action)}, {int(-1062731554)})")


да, может с *int* и *str* не красиво выглядит, но я уже отчаялся что "мало-ли"... Всё что нашел - перепробовал, поэтому я тут :) Выдаёт следующую ошибку:

('Error while preparing SQL statement:\n- SQLCODE: -206\n- Dynamic SQL Error\n- SQL error code = -206\n- Column unknown\n- OPEN_DOOR\n- At line 1, column 63', -206, 335544569)

Ещё где-то вычитал что при моём динамическом запросе надо вручную вызывать триггер из начала поста. Не знаю правда или нет и не знаю как xD
Подскажите пожалуйста как решить эту проблему. Спасибо!
  • Вопрос задан
  • 180 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Akina, Глеб Лукашонок, пожалуйста, не собирайте SQL запросы с помощью форматирования строк без крайней на то необходимости.

Используйте placeholders, и да пребудет с вами Бобби Тейблз.
cur.execute("insert into d_commands (executor, text, phis_addr) values (?, ?, ?)", (1, str(action), -1062731554))

В этом случае экранирование будет выполнено автоматически, без риска что вы забудете это сделать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
Greenway Global Новосибирск
от 150 000 ₽
SPA2099 Москва
До 100 000 ₽
HR Prime Москва
от 300 000 до 3 800 000 ₽