【问题标题】:Change Postgres search_path with Ecto使用 Ecto 更改 Postgres search_path
【发布时间】:2016-11-28 18:25:27
【问题描述】:

我想为我的 Phoenix 应用使用特定的 Postgres 架构。

我尝试通过Ecto.Repo.after_connect/1 回调来实现这一点,但它似乎在超时之前递归地创建了大约 10 次新的数据库连接。

这是我的回购文件:

defmodule MyApp.Repo do

  use Ecto.Repo, otp_app: :my_app
  use Scrivener, page_size: 20

  def after_connect(_pid) do
    IO.puts "after_connect"
    Ecto.Adapters.SQL.query(MyApp.Repo, "SET search_path TO 'my_app';", [])
  end

end

【问题讨论】:

  • 如果你想永久这样做,你可以使用alter user set ...更改用户的搜索路径
  • 我不想。我的目的是在 3 个不同的应用程序之间共享一个 Heroku Postgres 数据库(每个应用程序都有一个架构)
  • 那你为什么不创建三个不同的用户,每个用户都有特定的模式作为他们的默认搜索路径?
  • 因为我做不到。 Heroku 为单个用户提供单个数据库。
  • 我不认为你的用例很好,但问题仍然有效。

标签: postgresql elixir phoenix-framework ecto


【解决方案1】:

我认为超时发生是因为 after_connect 在 ecto 的设置周期中仍然太早。使用 ecto 2(仍处于测试阶段)以下工作,它是否在 ecto 1 中工作取决于您是否在 after_connection 中获取连接作为参数)。

在您的仓库中:

defmodule Et.Repo do
  use Ecto.Repo, otp_app: :et

  def set_search_path(conn, path) do
    {:ok, _result} = Postgrex.query(conn, "SET search_path=#{path}", [])
  end
end

在您的 config.exs 文件中:

config :et, Et.Repo,
  adapter: Ecto.Adapters.Postgres,
  database: "......",
  username: "......",
  hostname: "localhost",
  after_connect: {Et.Repo, :set_search_path, ["app,public,extensions"]}

希望对您有所帮助,--Kip

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我找到的第一个解决方案是在每次访问我的应用程序的 Repo 模块时添加 prefix(在 postgres 中称为模式)。 但是在最近版本的 ecto 和 phoenix_ecto 中,您可以修改模型的 postgres 架构,只需添加属性 @schema_prefix "your_schema"

    例子:

    defmodule YourApp.YourModel do
      use YourApp.Web, :model
    
      @schema_prefix "your_schema"
      schema "your_model" do
        field :name, :string
      end
    
      # more stuff...
    end
    

    您可以在 ecto 的 github 上查看有关此功能的讨论以及解决此问题的另一种方法:https://github.com/elixir-lang/ecto/issues/978

    PS:这解决了您的模型的数据库访问,但对于其他常规查询,您将在查询中指定前缀:

    %{query | prefix: "your_schema"}  
    

    希望对你有所帮助!

    【讨论】:

    • 谢谢费尔南多。这是迄今为止最好的答案,但我一直在寻找一种不那么突兀的方式来切换模式。我现在就用这个​​。
    • 这是迄今为止我找到的最好的解决方案 :)
    猜你喜欢
    • 1970-01-01
    • 2015-05-13
    • 2013-03-28
    • 2022-01-11
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    相关资源
    最近更新 更多