在Phoenix Framework中,为什么存在“方案”和迁移的冗余?

时间:2016-06-20 01:03:27

标签: elixir phoenix-framework ecto

如果不创建迁移,则无法修改架构?为什么有移民和计划?为什么不只是迁移?这似乎是多余的。

2 个答案:

答案 0 :(得分:4)

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

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

考虑一个新生成的凤凰应用程序,当我们运行mix ecto.create时,目前没有表只是一个空数据库。根据我们的要求,我们需要一个表格user。我们使用mix ecto.gen.migration add_users_table创建迁移

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

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

答案 1 :(得分:4)

您可能不需要创建迁移来修改架构。模式仅定义当时数据库中的内容(列,关系)。您可以直接使用数据库控制台(例如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

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