Alembic执行设置分隔符的原生SQL失败,无法创建触发器求助
解决Alembic中执行原生SQL触发器的ProgrammingError及Flask-Script弃用警告问题
一、核心错误:DELIMITER # 引发的ProgrammingError
你遇到的sqlalchemy.exc.ProgrammingError根本原因是:DELIMITER是MySQL命令行客户端的专属指令,并非标准SQL语句,SQLAlchemy的数据库连接不会识别这个命令,直接执行自然会报错。
要在Alembic中创建触发器,你不需要手动设置分隔符,SQLAlchemy会自动处理SQL语句的分隔逻辑。正确的做法是直接编写完整的触发器SQL字符串,然后执行:
def upgrade(): # 获取数据库连接 connection = op.get_bind() # 编写完整的触发器SQL(无需DELIMITER) trigger_sql = """ CREATE TRIGGER trigger_name BEFORE INSERT ON your_table_name FOR EACH ROW BEGIN -- 这里写你的触发器逻辑,比如设置默认值 SET NEW.your_column = CURRENT_TIMESTAMP; END """ # 执行触发器创建语句 connection.execute(trigger_sql)
如果你的触发器逻辑特别复杂,也可以使用SQLAlchemy的text对象来确保语句被正确解析:
from sqlalchemy import text def upgrade(): op.execute(text(""" CREATE TRIGGER trigger_name BEFORE UPDATE ON your_table_name FOR EACH ROW BEGIN SET NEW.updated_at = CURRENT_TIMESTAMP; END """))
二、Flask-Script弃用警告处理
你看到的ExtDeprecationWarning是因为旧的导入方式被弃用了,只需要把导入语句从:
from flask.ext.script import Manager
改成:
from flask_script import Manager
即可消除这个警告。
内容的提问来源于stack exchange,提问作者lsimmons
相关产品推荐
相关产品推荐

