Создание триггера с помощью SQLAlchemy DDL вызывает проблему с «% s» в триггере - PullRequest
0 голосов
/ 16 апреля 2019

В настоящее время я пытаюсь изучить основы SQLAlchemy после того, как опирался на sqlite3 ранее. Я пытаюсь создать таблицу с триггерами, но у меня возникла проблема с получением текущей метки времени Unix.

Код для создания временной метки в sqlite: strftime("%s", "now"), но он вызывает ошибку, так как %s анализируется до того, как он попадает в триггерную вставку.

Выполняя событие, оно форматируется до strftime("{'table': u'"Users"', 'fullname': u'"Users"', 'schema': ''}", "now"). Есть ли способ, которым я могу избежать этого?

В качестве альтернативы, лучше ли просто создавать исходную базу данных с триггерами в sqlite (имея в виду, что позже я планирую перейти на MySQL), и просто использовать SQLAcademy для доступа ко всему этому в моем коде?

Вот мой текущий тестовый код:

import sqlalchemy as db

engine = db.create_engine('sqlite://')
connection = engine.connect()
metadata = db.MetaData(engine)


if engine.dialect.has_table(engine, 'Users'):
    users = db.Table('Users', metadata, autoload=True)
else:
    users = db.Table(
        'Users', metadata,
        db.Column('row_id', db.Integer(), primary_key=True),
        db.Column('name', db.String(255), nullable=False),
        db.Column('num_logins', db.Integer(), default=0),
        db.Column('time_registered', db.Integer(), nullable=True),
        db.Column('time_updated', db.Integer(), nullable=True)
    )

    trigger = db.DDL("""
    CREATE TRIGGER user_update AFTER UPDATE ON Users
        FOR EACH ROW
        BEGIN
            UPDATE Users SET date_modified = strftime("%s", "now") WHERE row_id = NEW.row_id;
        END;
    """)
    db.event.listen(users, 'after_create', trigger.execute_if(dialect='sqlite'))
    users.create(engine)

Я пытался экранировать символы, которые только что сломали вещи, и передавать в качестве первого аргумента другой «% s».

1 Ответ

0 голосов
/ 17 апреля 2019

Оказалось, что это очень простая проблема, но я оставлю это, хотя на случай, если кто-нибудь еще столкнется с этим.

При копании в исходном коде я нашел эту строку посередине \sqlalchemy\sql\ddl.py: A literal '%' in a statement must be escaped as '%%'.

Работает нормально при использовании strftime("%%s", "now").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...