Rails+PostgreSQL导出structure.sql时PROCEDURE替代FUNCTION问题求助
解决Rails导出structure.sql时触发器使用PROCEDURE而非FUNCTION的问题
问题原因
PostgreSQL 11及以上版本中,触发器执行函数的语法从EXECUTE PROCEDURE更新为EXECUTE FUNCTION。若Rails导出structure.sql时仍生成旧语法,通常是以下原因:
- Rails版本未适配PostgreSQL 11+的语法变化
- Rails未正确检测到PostgreSQL服务器版本
- 项目配置未明确指定使用新语法
解决方案
1. 确认PostgreSQL版本
先确保你的PostgreSQL服务器版本在11或以上,执行以下命令验证:
psql --version
或在psql终端中执行:
SELECT version();
2. 升级Rails版本(若需要)
如果你的Rails版本低于6.0,可能未支持PostgreSQL 11的EXECUTE FUNCTION语法,建议升级到6.0及以上版本——Rails从6.0开始默认适配该语法。
3. 配置Rails强制使用EXECUTE FUNCTION
在Rails项目的config/application.rb文件中添加以下配置,强制触发器使用EXECUTE FUNCTION语法:
module YourAppName class Application < Rails::Application # ... 其他已有配置 ... # 强制触发器使用EXECUTE FUNCTION语法 config.active_record.use_execute_function_for_triggers = true end end
添加后重新执行rails db:schema:dump生成新的structure.sql即可。
4. 手动修正现有触发器定义(临时方案)
若暂时无法升级Rails或修改配置,可通过执行以下SQL语句手动更新数据库中的触发器定义,之后导出的structure.sql会使用新语法:
ALTER TRIGGER cache_comments_count ON public.comments RENAME TO cache_comments_count_old; CREATE TRIGGER cache_comments_count AFTER INSERT OR DELETE OR UPDATE ON public.comments FOR EACH ROW EXECUTE FUNCTION public.update_comments_counter(); DROP TRIGGER cache_comments_count_old ON public.comments;
执行后再运行rails db:schema:dump,导出的文件就会包含EXECUTE FUNCTION语句。
内容的提问来源于stack exchange,提问作者ChrisCPO
相关产品推荐
相关产品推荐

