使用SQLAlchemy DDL创建触发器会导致触发器中出现“%s”问题

时间:2019-04-16 16:34:44

标签: python sqlalchemy

在我以前依靠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 :(得分:0)

事实证明这是一个非常简单的问题,尽管其他任何人遇到,我都会保留。

在研究源代码时,我在\sqlalchemy\sql\ddl.py的中间找到了这一行:A literal '%' in a statement must be escaped as '%%'.

使用strftime("%%s", "now")时效果很好。