You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:13:23