gpt4 book ai didi

postgresql - 旧的 ecto 迁移无法运行,因为我向模型架构添加了一个新字段

转载 作者:行者123 更新时间:2023-11-29 14:32:40 25 4
gpt4 key购买 nike

我有一个旧迁移,用于更新角色数组字段中用户的角色。

此迁移不再运行,因为今天我在我的模式中添加了一个名为 is_bot 的字段。

这是我的迁移的样子:

def up do
query =
from(
u in "users",
select: %{id: u.id, email: u.email, onboarded: u.onboarded, roles: u.roles}
)

Repo.transaction(
fn ->
query
|> Repo.stream()
|> Stream.each(fn user ->
cond do
user.onboarded && user.roles != nil && length(user.roles) > 1 ->
roles = ["test"]

user
|> Repo.update_all(set: [roles: roles])

true ->
IO.puts("User #{user.email} has no roles. Onboarded: #{user.onboarded}")
end
end)
|> Stream.run()
end,
timeout: :infinity
)
end

还有我的模式:

schema "users" do
field(:email, :string)
field(:roles, {:array, :string})
field(:onboarded, :boolean, default: false)
field(:is_bot, :boolean, default: false)
end

我想通过在“用户”中使用 u,我可以避免在我的模型中遍历我的模式,但它似乎无论如何都在使用它。

错误:

** (Postgrex.Error) ERROR 42703 (undefined_column): column u0.is_bot does not exist
(db_connection) lib/db_connection.ex:1406: DBConnection.prepare_declare/4
(elixir) lib/stream.ex:1270: anonymous fn/5 in Stream.resource/3
(elixir) lib/stream.ex:1433: Enumerable.Stream.do_each/4
(elixir) lib/stream.ex:806: Stream.do_transform/8
(elixir) lib/stream.ex:1433: Enumerable.Stream.do_each/4
(elixir) lib/stream.ex:591: Stream.run/1
(ecto) lib/ecto/adapters/sql.ex:576: anonymous fn/3 in Ecto.Adapters.SQL.do_transaction/3
(db_connection) lib/db_connection.ex:1275: DBConnection.transaction_run/4

如何运行此迁移?

最佳答案

您正在滥用迁移来运行种子。您可能应该做的是将播种代码移动到 seeds/update_roles.exs 中,并使用此别名设置 ecto(在 mix.exs 文件):

defp aliases do
[
"ecto.setup": ["ecto.create", "ecto.migrate", "run seeds/update_roles.exs"],
...

这样一来,数据库将首先完全设置为现代版本,然后然后植入数据。当前代码尝试使用包含 is_bot 字段的模式在尚未包含它的数据库上运行种子。

关于postgresql - 旧的 ecto 迁移无法运行,因为我向模型架构添加了一个新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49269932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com