在我以前依靠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'作为第一个参数。
答案 0 :(得分:0)
事实证明这是一个非常简单的问题,尽管其他任何人遇到,我都会保留。
在研究源代码时,我在\sqlalchemy\sql\ddl.py
的中间找到了这一行:A literal '%' in a statement must be escaped as '%%'.
使用strftime("%%s", "now")
时效果很好。