@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
Подскажите пожалуйста как решить эту проблему. Спасибо!
  • Вопрос задан
  • 167 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Akina, Глеб Лукашонок, пожалуйста, не собирайте SQL запросы с помощью форматирования строк без крайней на то необходимости.

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

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

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

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