如果不创建迁移,则无法修改架构?为什么有移民和计划?为什么不只是迁移?这似乎是多余的。
答案 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
添加到架构块中。