В настоящее время я пытаюсь изучить основы 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».