【问题标题】:Phoenix Ecto can't find table created in other schemaPhoenix Ecto 找不到在其他模式中创建的表
【发布时间】:2018-07-29 14:35:12
【问题描述】:

我是 Elixir/Phoenix/Ecto 的新手。我使用 ecto.migration 创建了一个具有 4 个不同模式的数据库。表已正确创建,但当我尝试查询表时,ecto 找不到它们。

ERROR 42P01 (undefined_table): relation "users" does not exist

我知道问题与数据库架构有关,因为当我在默认架构中创建 users 表时,ecto 发现它没有任何问题。

【问题讨论】:

  • 确保先迁移 (mix ecto.migrate),然后才能使用这些表。
  • 尝试在 Ecto 模式声明中添加 @schema_prefix 注释。有关详细信息,请参阅 hexdocs.pm/ecto/Ecto.Schema.html#module-schema-attributes 中的 @schema_prefix 部分。
  • @Dogbert。你是对的,你的回答足够具体,很有帮助。如果您将此作为答案,我会接受。

标签: elixir ecto phoenix


【解决方案1】:

确保迁移文件和架构文件具有相同的表名“users”。 您可以使用mix ecto.migrations 命令检查每个迁移文件的状态,以确保它已应用于数据库。

在 Phoenix 中,您不必直接使用 Ecto 来创建模式。您可以使用 phoenix 命令来帮助您创建必要的文件和模块:

mix phx.gen.html Accounts User users username:string age:integer

这将创建一个迁移文件,该文件将创建一个“用户”表。它还将创建一个名为MyApp.Accounts.User 的架构文件和模块,该模块将通过schema "users" do 宏绑定到users 表。

如果您手动创建迁移文件,请确保您在任何地方都使用正确的表名,即在查询和架构文件中。

【讨论】:

  • 我觉得你的回答不够具体。问题是在我的 Repo.all() 和其他函数中,我需要包含前缀:'accounts。我不想回答我自己的问题,所以如果你想改进你的答案,我会接受。
  • 公平地说,@Dogbert 正确回答了这个问题,所以应该归功于他。老实说,他如何准确地指出问题,真是令人惊讶。我认为 phoenix 在 1.3 final 发布之前删除了架构前缀。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多