我正在为多租户使用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
请帮助我如何执行选择查询?
答案 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()。