.NET toolkit di migrazione di database
-
05-09-2019 - |
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?
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.
- Possibilità di apportare modifiche in una transazione di rollback ci dovrebbe essere un problema. (L'integrità dei dati o in altro modo)
- Possibilità di visualizzare gli script SQL generati effettive in caso di necessità
- 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.