在Phoenix Framework中,为什么会有"schemes"的冗余和迁移?

In Phoenix Framework, why is there a redundancy of "schemes" and migration?

您不能在不创建迁移的情况下修改模式吗?为什么会有迁移和计划?为什么不只是迁移?好像有点多余。

Migrations 是更改数据库架构的便捷方法。每次迁移都可以视为数据库的新版本。您可以根据需要添加或删除 table、列或条目。 Schema 是数据库的当前状态。

建议通过迁移更改架构,因为您知道更改数据库的历史,并且它提供了回滚迁移等功能。

考虑一个新生成的 phoenix 应用程序,当我们 运行 mix ecto.create 时,没有 table 当前只是一个空数据库。根据我们的要求,我们想要 table 说 user。我们使用 mix ecto.gen.migration add_users_table 创建一个 migration

def change do
  create table(:users) do
    add :name,       :string
    add :age, :integer
    timestamps
  end
end

我们可以使用 mix ecto.migrate 迁移(应用)这个 migration。 现在我们有了一些模式,它基本上由用户 table 和我们添加的相关列组成。如果我们认为使用 mix ecto.rollback 不合适,我们可以回滚此迁移,这将撤消架构更改

您可能不需要创建迁移来修改架构。模式仅定义当时数据库中的内容(列、关系)。您可以直接使用 psql 等数据库控制台或 pgadmin 等其他工具更改所有这些,然后在模式模型中进行相应的更改,无需任何迁移文件:)

defmodule Pxblog.Post do
use Pxblog.Web, :model

alias Pxblog.User

schema "posts" do
  field :title, :string
  field :body, :string
  belongs_to :user, User
  has_many :comments, Pxblog.Comment

  timestamps
end

@required_fields ~w(title body)
@optional_fields ~w()

def changeset(model, params \ :empty) do
  model
  |> cast(params, @required_fields, @optional_fields)
end
end

例如,您可以直接通过运行 alter查询将列author_name添加到table,而只需将field :author_name, :string添加到架构中块。