首页 > 解决方案 > 如何在 ecto 迁移中执行 SQL SELECT 查询

问题描述

我正在为多租户使用 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

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

标签: migrationelixirecto

解决方案


不要将迁移用作为数据库播种的工具。如果您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 查询。


推荐阅读