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

Heroku Postgres迁移中enable_extension与create_table的schema_search_path不一致问题

解决Heroku Postgres扩展在heroku_ext schema下的uuid函数调用问题
  • 强制迁移全程使用指定schema路径
    在迁移文件最开头加一行执行语句,把schema搜索路径固定为heroku_ext, public,避免Heroku在执行create_table时自动重置:

    execute "SET schema_search_path TO heroku_ext, public;"
    

    把这行放在enable_extension和create_table之前,确保整个迁移流程里Postgres都能找到两个schema里的对象。

  • 优化enable_extension的重写逻辑
    之前的重写可能只在安装扩展时临时改路径,要让路径变更持续生效:

    def enable_extension(name)
      super
      # 修改数据库默认路径
      execute "ALTER DATABASE #{connection.current_database} SET schema_search_path TO heroku_ext, public;"
      # 同步更新ActiveRecord连接的当前路径
      connection.schema_search_path = "heroku_ext, public"
    end
    

    这样后续的create_table操作会继承这个路径设置,不会再变回只搜public。

  • 直接指定函数的schema前缀
    如果上面两种方法都没解决,就直接在create_table里给uuid函数加上schema前缀,硬编码路径:

    create_table :your_table, id: :uuid do |t|
      t.uuid :some_column, default: -> { "heroku_ext.uuid_generate_v4()" }
      # 其他字段定义
    end
    

    这种方式最稳妥,不管搜索路径怎么变,都能精准定位到函数。

内容的提问来源于stack exchange,提问作者James Woodrow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:54:20