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

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

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

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

Войти через центр авторизации
Похожие вопросы