2016-06-20 9 views
0

Sie können das Schema nicht ändern, ohne eine Migration zu erstellen? Warum gibt es Migration und Systeme? Warum nicht nur Migration? Es scheint überflüssig.In Phoenix Framework, warum gibt es eine Redundanz von "Schemata" und Migration?

+0

Wenn Sie sagen, Schema, meinst du DB-Schema oder Ecto.Schema? Mit anderen Worten, ist Ihre Frage über die Notwendigkeit, die Eigenschaften in Ihren Modellen zusätzlich zur Angabe beim Erstellen von Migrationen oder etwas ganz anderes anzugeben? –

Antwort

4

Migrations sind bequeme Möglichkeiten, Ihr Datenbankschema zu ändern. Jede Migration kann als eine neue Version Ihrer Datenbank betrachtet werden. Sie können Tabellen, Spalten oder Einträge gemäß Ihren Anforderungen hinzufügen oder entfernen. Hier ist Schema der aktuelle Status der Datenbank.

Es wird empfohlen, das Schema durch Migrationen, zu verändern, da Sie die Geschichte wissen, wie Sie Ihre Datenbank geändert und bietet Funktionen wie die Migration ein Rollback.

Betrachten Sie eine neu erstellte Phoenix App, wenn wir mix ecto.create ausführen, gibt es derzeit keine Tabellen nur eine leere Datenbank. Gemäß unseren Anforderungen möchten wir eine Tabelle sagen user. Wir erstellen eine Migration mit mix ecto.gen.migration add_users_table.

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

Wir wandern (anwenden), um diese Migrationmix ecto.migrate verwenden. Jetzt haben wir ein Schema, das im Wesentlichen aus der Benutzertabelle und den dazugehörigen Spalten besteht. Wir könnten diese Migration rückgängig machen, wenn wir der Ansicht sind, dass sie unangemessen ist und mix ecto.rollback verwendet, wodurch die Schemaänderungen rückgängig gemacht werden.

+0

Ich denke nach Schema bezieht er sich auf Ecto.Schema, aber ich könnte falsch liegen. Die Tatsache, dass Sie Eigenschaften in Ihren Modellstrukturen angeben müssen, anstatt sie zur Laufzeit (a la ActiveRecord) definiert zu haben, hat einige Ingenieure aus der Welt von Rails, die ich kenne, irritiert. –

+0

@CodyPoll Sie könnten Recht haben, ich werde bearbeiten oder löschen Sie meine Antwort, brauchen mehr Informationen aus der Frage – coderVishal

+1

Ich bin Anfänger in der Welt der Programmierung und Frameworks. Ich habe nicht verstanden, was der CoderVishal gesagt hat, aber seine Antwort hat meine Frage fast vollständig beantwortet. Was fehlte, wurde von Thao Hoang erledigt. Danke euch allen! Automatisch übersetzt. –

4

Sie müssen möglicherweise keine Migration erstellen, um das Schema zu ändern. Das Schema definiert nur, was sich zu diesem Zeitpunkt in der Datenbank befindet (Spalten, Relationen). Sie können alle, die mit Datenbank-Konsole ändern, wie psql direkt oder anderen Tools wie pgadmin und führen Sie dann in dem Schema Modell die entsprechende Änderung ohne Migrationsdatei:)

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 

Zum Beispiel können Sie eine Spalte hinzufügen author_name in die Tabelle durch Ausführen von alter Abfrage direkt, und fügen Sie einfach field :author_name, :string in den Schemablock.

+0

Wenn jemand ein Anfänger ist, würde ich dies nicht empfehlen, denn Migrationen werden auf lange Sicht viele Vorteile bringen. – coderVishal

+0

+1! IMO, dies ist nur für den Fall, wenn Sie eine Legacy-Datenbank behandeln oder teilen Sie die DB mit einigen anderen Apps:) –