migration - 如何在 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
请帮我如何执行选择查询?
解决方案
不要将迁移用作为数据库播种的工具。如果您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 查询。
推荐阅读
- android - 如何在屏幕旋转期间保存 MutableList 的状态
- javascript - MongoDB在双重嵌套数组中获取最大日期
- angular - ngx-daterangepicker-material 以上个月和当前月份而不是当前和下个月打开
- google-bigquery - 阻止用户删除 BigQuery 表
- ruby - 每次出现该事件时,在 logstash 中使用 Ruby 过滤器对字段的值求和
- python - 如何按 Python 中的第一个元素重新分类元组列表?
- apache-spark - Apache Spark:获取每个分区的第一行和最后一行
- r - 以前安装的版本中的 R 包在哪里?
- mysql - 如何将我的 React Native 应用程序连接到 MySQL 服务器?
- python - 矩阵中的for循环