首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Ecto改变Postgres search_path

用Ecto改变Postgres search_path
EN

Stack Overflow用户
提问于 2016-02-01 13:06:59
回答 2查看 1.2K关注 0票数 6

我想为我的凤凰应用程序使用一个特定的Postgres模式。

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

这是我的回购文件:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-18 02:21:30

我认为超时的发生是因为在ecto的安装周期中after_connect还太早。使用ecto 2(仍然处于beta版),它是否在ecto 1中工作将取决于您是否将连接作为after_connection中的一个参数)。

在你的回购中:

代码语言:javascript
复制
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文件中:

代码语言:javascript
复制
config :et, Et.Repo,
  adapter: Ecto.Adapters.Postgres,
  database: "......",
  username: "......",
  hostname: "localhost",
  after_connect: {Et.Repo, :set_search_path, ["app,public,extensions"]}

希望这能帮上忙--基普

票数 7
EN

Stack Overflow用户

发布于 2016-02-08 14:31:45

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

示例:

代码语言:javascript
复制
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:这解决了模型的数据库访问问题,但对于其他常规查询,您可以在查询中指定前缀:

代码语言:javascript
复制
%{query | prefix: "your_schema"}  

希望我能帮上忙!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35131338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档