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

Drush sql-dump能否导出存储过程?如何添加该功能?

Drush sql-dump 存储过程导出问题及自定义功能指南

先给你明确答案:默认确实无法导出,--routines参数无效是常见情况

没错,默认情况下Drush sql-dump不会导出MySQL的存储过程、自定义函数这类数据库对象,哪怕你加了--routines参数也可能没效果。核心原因是早期Drush版本(比如Drush 8及更早)在封装底层的mysqldump命令时,压根没把--routines这类参数传递过去。

不过要注意:Drush 10+的新版本已经修复了这个问题,但如果你的项目还在使用旧版本,或者数据库驱动配置有特殊情况,还是会遇到这个问题。你可以自己验证下:直接跑原生的mysqldump --routines --databases your_db,如果能导出存储过程,但Drush命令不行,那肯定是Drush的封装层没传参数。

想自己加这个功能?从这几个地方入手就行

如果你的Drush版本确实不支持,动手扩展也不难,步骤如下:

1. 找到sql-dump的核心代码文件

Drush的命令逻辑都在源码里,不同版本路径略有差异:

  • Drush 10+:找src/Commands/SqlCommands.php,里面的dump方法就是处理导出的核心
  • 旧版本(Drush 8及更早):找commands/sql/sql.drush.inc,对应的命令定义和逻辑都在这里

2. 添加入参支持

先让Drush识别--routines和--triggers参数:

  • 新版本(注解式):在dump方法的注解里加参数定义:
    /**
     * Exports the Drupal DB as SQL.
     *
     * @option routines Include stored procedures and functions in the dump.
     * @option triggers Include database triggers in the dump.
     * @command sql:dump
     */
    
  • 旧版本:在drush_command()函数的options数组里加对应的项:
    'options' => [
      'routines' => 'Include stored procedures and functions in the dump.',
      'triggers' => 'Include triggers in the dump.',
    ],
    

3. 把参数传递给底层的导出命令

找到构建底层导出命令的逻辑(比如调用dumpCmd()的地方),判断用户是否传了--routines,然后把参数追加到底层命令里:

// 先获取基础导出命令
$dump_cmd = $this->sql->dumpCmd();

// 如果用户指定了--routines,追加参数
if ($this->input->getOption('routines')) {
    $dump_cmd .= ' --routines';
}
// 触发器同理,常和存储过程一起导出
if ($this->input->getOption('triggers')) {
    $dump_cmd .= ' --triggers';
}

注意:如果是PostgreSQL数据库,参数不一样,要先判断当前数据库驱动,再添加对应参数(比如PostgreSQL用--functions)。

4. 测试验证

修改代码后,本地安装修改后的Drush,执行drush sql-dump --routines,然后打开导出的SQL文件,搜索存储过程的名字,看看有没有对应的CREATE PROCEDURE/CREATE FUNCTION语句。另外要确保执行Drush的用户有足够的数据库权限读取存储过程定义。

5. 贡献给官方(可选)

如果你的修改是通用的,不妨提交PR到Drush官方仓库,帮其他遇到同样问题的开发者解决麻烦~


内容的提问来源于stack exchange,提问作者Raf A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:17:40