如何在ecto迁移中执行SQL SELECT查询

时间:2019-07-10 01:38:49

标签: migration elixir ecto

我正在为多租户使用Triplex软件包。创建租户时,它会执行所有迁移。创建表后,当我执行种子迁移时,它给我错误:

{:error, "ERROR 42P01 (undefined_table) relation \"t2.tenants\" does not exist\n\n query: (SELECT MAX(id) from \"t2.tenants\")"}

有关选择查询。如果删除选择查询,其他查询将成功执行。

defmodule TudoChat.Repo.Migrations.SeedTableTenants do
  use Ecto.Migration

  def up do
    execute("INSERT INTO t2.tenants (\"id\", \"inserted_at\", \"name\", \"status\", \"updated_at\") values ('1', '2019-07-08 10:37:28', 'tudo_', 'active', '2019-07-08 10:37:30')")
    execute("INSERT INTO t2.tenants (\"id\", \"inserted_at\", \"name\", \"status\", \"updated_at\") values ('2', '2019-07-08 10:38:19', 'test_', 'active', '2019-07-08 10:38:22')")
    execute("(SELECT MAX(id) from \"t2.tenants\")")
  end

  def down do
  end
end

请帮助我如何执行选择查询?

2 个答案:

答案 0 :(得分:1)

请勿将迁移作为工具来播种数据库。如果您使用Ecto中的默认priv/repo/seeds.exs设置,则已经有种子文件。在那里,您可以使用ecto模式和Repo

例如:

  alias TudoChat.Repo
  alias TudoChat.Tenant

  Repo.insert! %Tenant{
    name: "tudo",
    status: "active"
  }

  Repo.insert! %Tenant{
    name: "test",
    status: "active"
  }

通过这种方式,您不必担心种子数据的ID和时间戳,因为Ecto会为您处理。

运行迁移后,您还必须再运行一个命令:

mix ecto.migrate
mix run priv/repo/seeds.exs

如果确实需要在种子中运行查询,那么还可以使用常规的ecto查询。

答案 1 :(得分:0)

请勿键入带有引号的字符串。您喜欢转义嵌套引号吗?如果不是,请使用let array = [1, 2, 3] // Compiler error. Array content immutable. array[0] = 9 // Compiler error. Array reference immutable. array = [4, 5, 6] ~s|...|~s{...}~s(...)代替外部双引号。例如:

~s<....>

以下是您使用iex(2)> ~s|I said, "Go home!"| "I said, \"Go home!\"" 标记的声明:

~s

但是那条线仍然太松了。因此,请执行以下操作:

execute(~s|INSERT INTO t2.tenants ("id", "inserted_at", "name", "status", "updated_at") values ('1', '2019-07-08 10:37:28', 'tudo_', 'active', '2019-07-08 10:37:30')|)

columns = ~s|("id", "inserted_at", "name", "status", "updated_at")| values = "('1', '2019-07-08 10:37:28', 'tudo_', 'active', '2019-07-08 10:37:30')" query = "INSERT INTO t2.tenants #{columns} values #{values}" IO.inspect query execute(query) 如下所示:

query
  

请帮助我如何执行选择查询?

"INSERT INTO t2.tenants 
    (\"id\", \"inserted_at\", \"name\", \"status\", \"updated_at\") 
 values 
    ('1', '2019-07-08 10:37:28', 'tudo_', 'active', '2019-07-08 10:37:30')"

1)您的数据库是否真的需要在SELECT语句周围加上括号?

execute("(SELECT MAX(id) from \"t2.tenants\")")

2)在成功的INSERT语句中,您不必引用表名。您的数据库是否真的要求您在SELECT中引用表名?

  |                                  |
  V                                  V
 "(SELECT MAX(id) from \"t2.tenants\")" 

怎么样:

                        |           |
                        V           V
 "(SELECT MAX(id) from \"t2.tenants\")"

但是,如果成功,execute("SELECT MAX(id) from t2.tenants") 返回execute(),所以我不确定执行该SELECT语句是否有帮助。您可能想看看Ecto.Adapters.SQL.query()