Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
5 / 5 / 0
Регистрация: 25.09.2017
Сообщений: 569

Не срабатывают триггеры в sqlalchemy.orm

17.12.2023, 02:08. Показов 1974. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! триггеры почему-то не хотят слушать события "before_insert".

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from databases import Database
from sqlalchemy import DDL, event
 
from . import db
 
database = Database(db.url_db.render_as_string())
db.Base.metadata.create_all(db.engine)
 
unique_info_values = DDL(
    """
    CREATE OR REPLACE FUNCTION unique_values() RETURNS TRIGGER AS $$ 
    BEGIN
        IF (SELECT COUNT(*) FROM Info WHERE (Info.A, Info.B) = (NEW.B, NEW.A)) > 0 THEN 
            RAISE '23Q01' USING message=format('Such Info %s are exist', NEW); 
    END IF; 
    END; $$ LANGUAGE PLPGSQL
    """,
    bind=db.engine
)
 
triger_unique_info_values = DDL(
    """
    CREATE OR REPLACE TRIGGER unique_info_values BEFORE INSERT OR UPDATE ON Info 
    FOR EACH STATEMENT EXECUTE PROCEDURE unique_values();
    """,
    bind=db.engine
)
 
event.listen(db.Info, "before_insert", unique_info_values.execute_if(dialect=("postgresql", "sqlalchemy")))
event.listen(db.Info, "before_update", unique_info_values.execute_if(dialect=("postgresql", "sqlalchemy")))
event.listen(db.Info, "before_insert", triger_unique_info_values.execute_if(dialect=("postgresql", "sqlalchemy")))
event.listen(db.Info, "before_update", triger_unique_info_values.execute_if(dialect=("postgresql", "sqlalchemy")))
Таблица Info создана и в контейнере, который соответствует сервису БД она создана также.
Происходит запрос вида:


SQL
1
INSERT INTO "Info" (A,  B) VALUES (2, 1)
Такая пара значений 1, 2 уже есть и в соответствии с функцией триггера, которая проверяет (ну или должна проверять), что такой набор УЖЕ есть, транзакция в виде запроса, приведённого выше, не должна пройти.

Я и как вы видите и диалекты, указал, все, которые sql alchemy использует.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.12.2023, 02:08
Ответы с готовыми решениями:

Построение подзапроса в sqlalchemy orm
Дано 2 запроса: query_first = DB_SESSION.query(AllFlats, distance).filter(or_( AllFlats.is_apart == False, ...

Отрисовка TreeView / не срабатывают триггеры
Всем привет.. вопрос такой - на форме имею 2х уровневый TreeView с чекбоксами, триггеры BeforeCheck и AfterCheck, простая функция, которая...

Не срабатывают стили для текста, но для фона срабатывают
<form action="#" method="post"> <input placeholder="Введите имя" type="text" name="first-name"...

2
5 / 5 / 0
Регистрация: 25.09.2017
Сообщений: 569
17.12.2023, 14:15  [ТС]
Эта библиотека вообще может слушать события на уровне базы данных? Как тогда цель передавать в качестве чего? В документации примеры с объектами orm. Получается, что не может, зато триггеры будут на уровне БД просто так болтаться?
0
5 / 5 / 0
Регистрация: 25.09.2017
Сообщений: 569
18.12.2023, 01:46  [ТС]
Я немного оговорился, вообще в документации https://docs.sqlalchemy.org/en/14/core/ddl.html нет таких примеров с объектами orm, есть только примеры с объектами таблицы (тип Table). Но вроде те события ("before_insert"), что я использую, их средствами sql alchemy триггеры слушают через orm объекты, как у меня в коде.

Но если после соответствующей операции вызывается commit у экземляра сессии, то происходит ошибка:

Bash
1
2
3
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/events.py", line 760, in wrap
web_1          |     fn(*arg, **kw)
TypeError: __call__() takes 3 positional arguments but 4 were given
Но, получается, что нельзя использовать orm объект?

Добавлено через 58 минут
Такой код сейчас:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from databases import Database
from sqlalchemy import DDL, event
 
from . import db
 
database = Database(db.url_db.render_as_string())
db.Base.metadata.create_all(db.engine)
 
 
#Подказали , что "after_create" прослушивается только у ядра sql alchemy, то ест ь после создания таблицы, будет создана эта процедура:
@event.listens_for(db.Info.__table__, "after_create")
def replace_after_create(target, connection, **kwargs):
    connection.execute(
        """
        CREATE OR REPLACE FUNCTION check_unique_info() RETURNS TRIGGER AS $$ 
        BEGIN
        IF (SELECT COUNT(*) FROM Friends WHERE (Info.A, Info.B) = (NEW.B, NEW.A)) > 0 THEN 
            RAISE EXCEPTION 'Such Info % are exist', NEW; 
        END IF; 
        RETURN NEW;
        END; $$ LANGUAGE PLPGSQL
        """
    )
 
 
triger_unique_info_values = DDL(
    """
    CREATE TRIGGER unique_info BEFORE INSERT OR BEFORE UPDATE ON Info
    FOR EACH ROW EXECUTE FUNCTION check_unique_info();
    """,
    bind=db.engine
)
 
 
event.listen(db.Info, "before_insert", triger_unique_info_values.execute_if(dialect=("postgresql", "sqlalchemy")))
event.listen(db.Info, "before_update", triger_unique_info_values.execute_if(dialect=("postgresql", "sqlalchemy")))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2023, 01:46
Помогаю со студенческими работами здесь

Django ORM запрос с подзапросом или переведите SQL в запрос Django ORM
В общем весь вопрос был в заголовке! Есть запрос на SQL он работает нормально вот только не знаю как заставить Django-mptt корректно на...

Flask-SQLAlchemy One to Many
Есть 2 модели: class Citizen(db.Model): import_id = db.Column(db.Integer, db.ForeignKey("import.import_id"), primary_key=True) ...

update many sqlalchemy
Есть таблица class Cars(base): __tablename__ = 'Cars' Car_ID = Column(Int, primary_key=True, autoincrement=True) ...

SqlAlchemy FileField
Вообщем ищу реализацию FileType для Column в SqlAlchemy. Нигде не могу её найти. Подскажите, может есть у кого или как реализовать? Нужно...

Запрос в SQLAlchemy
У меня есть небольшой проект во Flask с SQL Alchemy. В нем есть такая простая функция, которая просто берет все данные из таблицы. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru