Domanda

Il mio progetto pet corrente è una libreria di migrazione di database indipendente dal linguaggio ( Wizardby su Google Code). E 'più o meno ispirata ActiveRecord Migrazioni, ma ha un paio di sottigliezze. Per esempio, fa un po 'di base "inferenza" in modo da non dovete specificare il tipo di una colonna FK. E 'anche abbastanza intelligente per generare script "downgrade" dato solo "upgrade" di sequenza. Anche se le migrazioni sono scritti in una DSL speciale, questo strumento si rivolge principalmente a progetti .NET. E 'anche database indipendente dalla piattaforma.

Ecco un breve assaggio della sintassi:

  migration "Blog" revision => 1:
    type-aliases:
      type-alias N type => String, length => 200, nullable => false, default => ""

    defaults:
      default-primary-key ID type => Int32, nullable => false, identity => true

    version 1:
      add table Author:
        FirstName type => N
        LastName type => N
        EmailAddress type => N, unique => true
        Login type => N, unique => true
        Password type => Binary, length => 64, nullable => true

      add table Tag:
        Name type => N

      add table Blog:
        Name type => N
        Description type => String, nullable => false

      add table BlogPost:
        Title type => N
        Slug type => N
        BlogID references => Blog
        AuthorID references => Author

      add table BlogPostTagJunction primary-key => false:
        BlogPostID references => BlogPost
        TagID references => Tag

    version 2:
      add table BlogPostComment:
        BlogPostID references => BlogPost
        AuthorEmailAddress type => N
        Content type => String, nullable => false

    version 3:
      add table Media:
        TypeID type => Int32
        Name type => N
        MimeType type => N
        Length type => Int32
        BlogPostID nullable => true, references => BlogPost
        BlogPostCommentID nullable => true, references => BlogPostComment

      add table User:
        Login type => String, length => 200, nullable => false
        Password type => Binary, length => 64, nullable => false

        index IX_Login columns => [ID, [Login, desc]], unique => true

    version 4:
        add table Forum:
          Name type => String, length => 200, nullable => false
        add column ModeratorUserID nullable => false, references => User

    version 5:
        remove index IX_Login table => User

    version 6:
        add index IX_Login table => User, columns => [ID, [Login, desc]], unique => true

    version 7:
        BlogAuthorJunction primary-key => false:
            BlogID references => Blog
            AuthorID references => Author

        execute native-sql upgrade-resource => InsertSeedData, downgrade-resource => DeleteSeedData

Sono a conoscenza di altre librerie di migrazione là fuori, ma hey, è un progetto di pet!

La domanda è: quali caratteristiche si aspetta da toolkit di migrazione di database in generale, e quello che si può dire su questo cucciolo particolare sintassi-saggio?

È stato utile?

Soluzione

Dagli sguardi di esso devo dire che è farily facile da seguire e nel complesso la struttura si presenta abbastanza pulito.

Le più grandi caratteristiche che sto cercando in qualcosa di simile sono i seguenti.

  1. Possibilità di apportare modifiche in una transazione di rollback ci dovrebbe essere un problema. (L'integrità dei dati o in altro modo)
  2. Possibilità di visualizzare gli script SQL generati effettive in caso di necessità
  3. rollback automatico, in caso di guasto l'ultima versione

Non ho altre condizioni per il movimento di chiavi, indici, e il come, ma sembra che si è già gestito. Per me è molto concentrato sui controlli attorno alla effettiva esecuzione, e un piano solido backout veloce!

Altri suggerimenti

Mi piace questa sintassi. Nel vostro campione si concentrato sul cambiare la struttura. Ma per quanto riguarda la manipolazione dei dati?

E 'molto spesso quando nella migrazione devo modificare i dati (ad esempio aggiungere alcuni dati del dizionario).

Mi piacerebbe vedere la possibilità di verificare che ogni revisione è stata applicata a un database. Quindi, diciamo per esempio la versione 3 aggiunta la tabella 'media'. Da allora le versioni 4 e 5 sono stati aggiunti al database, ma da qualche parte lungo la linea di 'Johnny Q Expert' cancellato la tabella 'media'. Ora arriva la versione 6, che ha bisogno di alter table i 'media' (che non esiste più) - una funzione di verifica potrebbe essere utile che assicura il culmine di tutte le modifiche apportate nelle versioni 1-5 sono presenti nel database in modo che la prossima versione può essere applicato correttamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top