Mysql-migrația este și modul în care să pună în aplicare un simplu script PHP, webdevkin

La elaborarea unei aplicatii web care nu o dată, ci într-o echipă și / sau peste mai multe mașini, se confruntă mai devreme sau mai târziu problema de sincronizare a codului proiectului și a bazelor de date. Pentru controlul sursei există un sistem de control al versiunii, în special, Git. și pentru migrarea bazei de date a inventat.







Există multe gata făcut o varietate de instrumente care se ocupă cu migrația, dar!

Foarte des, tot ceea ce ne dorim - este doar pentru a completa modificările bazei de date, care sunt făcute de către un alt dezvoltator sau le pe o altă mașină. Și, de preferință, în timp ce cheltuind efort minim, inclusiv a studiului și instituirea unui sistem necunoscut. În plus, nu întotdeauna avem acces deplin la server pentru a instala instrumentele add.

Prin urmare, toți cei care sunt interesați să învețe cum să te facă un simplu utilitar de migrare, scrise cincizeci de linii de cerere php-cod în articol.

Ideea migrației

Ideea este destul de simplu: în proiect pentru a crea un dosar separat SQL, SQL în cazul în care pentru a pune fișiere cu migrații, adică, script-uri care schimba conținutul bazei de date, precum și un php-fișier care migrarea și rolele.

Noi trebuie să ia în considerare două lucruri: în primul rând, fiecare migrare trebuie să fie efectuată o singură dată, și în al doilea rând, în ordine strictă. Acest lucru este rezonabil și necesar, pentru că dacă vom ajunge la 2 colegi de migrație, una dintre care creează un tabel de utilizatori, iar celălalt adaugă utilizatorii de testare, vrem să execute script-urile în această ordine și nu adăugarea de baze de date de mai mult de un ori.

Problema re-rula migrația decidem, scris într-un tabel separat script-uri deja cheltuite și ordinul de execuție pentru a stabili reguli clare de a numi sql-fișier. Cum este rezolvată în codul, vom vedea mai târziu, dar acum vom trece la pregătirea migrațiilor de testare în sine (sursa tuturor migrației și script PHP la sfârșitul articolului)

Crearea de testare SQL script-uri

Să avem o bază de date test numit de test. Am lucrat cu ea pentru o vreme și a decis să pună în aplicare migrația. Există o regulă rezonabilă de degetul mare este prima migrare ar trebui să conțină o groapa completă a entităților existente în baza de date. Clarificarea: ajutor migrația nu numai să se extindă în mod constant baza existente, dar, de asemenea, să se rostogolească aceeași bază de date de la zero, de exemplu, pentru oameni noi la echipa.

Înainte de a începe migrarea, cred, că există deja această bază de date, astfel încât migrația este nicăieri specificat numele bazei de date. În opinia mea, este bine, în sensul că, pe de o mașină programator poate lucra cu diferite baze de date și cu versiuni diferite. Prin urmare, vom crea o bază de script-ul nu va fi.

Într-un caz test, ia în considerare acest curs de evenimente.
Migrarea primele role de date existente și creează tabelul de versiuni - conține script-uri deja făcute.






Al doilea creează un tabel de utilizatori cu trei domenii: id, e-mail, parola.
Al treilea adaugă trei utilizatori de înregistrări de testare.
O a patra adaugă o nouă coloană pentru utilizatorii activi.

Scrieți prima migrare: benă versiuni de baze de date și de masă. Să presupunem că, la momentul introducerii migrației avem masa de bunuri cu o pereche de produse. Ei au nevoie să arunce în script-ul și, în același script pentru a adăuga un tabel versiuni. Ca urmare, fișierul va arăta.
0000_base.sql

Fișierul vom vedea structura mărfurilor și 2 linii de date, precum și versiuni. Acest tabel conține 3 coloane: cheie id primar, nume - numele fișierului cu migrația, a creat - data de rulare sale. După cum s-ar putea imagina, în versiunile vom fi adăugarea de noi linii de rulare după migrare. Între timp, restul de 3 va crea o migrare.

Să acorde o atenție la convențiile de denumire fișier - este o parte importantă.
  • 0001_base.sql
  • 0002_add_users.sql
  • 0003_insert_data_into_users.sql
  • 0004_add_column_active_to_users.sql

Numerele ordinale la începutul fiecărui fișier trebuie să sortăm corect fișierele. Numai în acest caz, migrația va fi efectuată în ordinea corectă. După _ este o scurtă descriere a migrației, care trebuie să fie numai pentru comoditatea noastră, pentru a înțelege ceea ce face un anumit scenariu, fără să se uite la el.

În versiunea noastră, vom presupune că migrația nu va fi mai mult de 9999 de bucăți, iar numărul trebuie să constea întotdeauna din 4 cifre. De exemplu, al 10-lea va fi numit migrația 0010_description, și 101-I - 0101_description.

Acum suntem gata pentru a scrie un script PHP pentru a efectua migrarea - migration.php.

Scrierea php-cod pentru a rula migrări

Noi credem că trebuie să fim în stare să facă.
  • În primul rând, lista toate fișierele sql sql-din dosar.
  • În al doilea rând, dau seama care dintre ele au anterior Nakata (compară această listă cu ceea ce este în versiunile de masă).
  • În al treilea rând, se toarnă conținutul fișierelor selectate în baza de date, în același timp, în scris, versiunile numele lor.
Poate că toate celelalte operații sunt destul de simple, le analiza în cursul piesei.
Puteți scrie cod.

cadru migration.php, constantele de bază și funcții

Trebuie să scrie anumite funcții pentru a se conecta la baza de date și logica generală a scenariului. Migration.php a crea un fișier în sql Kinema locația sa de lângă migrații și scrie după cum urmează:

Vom trece peste acest cod.
  • În primul rând, declarăm o conexiune constantă la baza de date și versiunile numele tabelului (va fi menționat în codul de mai multe ori).
  • Funcția connectDB returnează un mysqli-obiect pentru a lucra cu baza de date.
  • getMigrationFiles ($ conn) returnează o listă relevantă, nu este finalizat încă migrații.
  • migra ($ conn, $ file), sub formă de rulouri o migrare - după nume de fișier.
Apoi logica în sine.
  • Am conecta la baza de date și de a obține o listă de migrații curente.
  • Dacă este goală, pur și simplu afișa un mesaj care baza de date este actualizată.
  • Dacă fișierele de migrare sunt apoi executați pentru fiecare funcție pe Migrare, afișând numele fișierului pentru informații. Și în final vom scrie un mesaj pozitiv faptul că migrarea este completă.
Acum avem nevoie de un cod pentru getMigrationFiles ()

Apoi, funcția trage toate glob fișierele într-un folder specificat pe masca * .sql dorit.

Apoi, trebuie să înțelegeți, nu pentru prima dată, dacă vom rostogolească migrației. Care poate fi determinată numai prin prezența a tabelului în versiunile de baze de date. Ne amintim că este creat în prima migrare. Dacă interogarea afișează tabelele de la testul ca „versiuni“ va returna o listă goală, apoi masa încă, în $ firstMigration variabilă scrie adevărat și revenirea funcției, întreaga listă de fișiere.

Dacă există tabela versiuni, atunci vom scoate din lista de fișiere - finalizate deja migrația. Și sa întors din fișierele de funcții care nu sunt în tabelul de versiuni. Acest lucru va ajuta la array_diff.

lista toate fișierele necesare ne-am lăsat să ne dăm seama cum să arunce conținutul în baza de date - emigrante caracteristica.

Din interes în această funcție numai shell_exec (comanda $) - punerea în aplicare a unei comenzi $ string în terminal. Se toarnă conținutul sql-fișier în baza de date poate fi o echipă
mysql -uuser -ppassword -h bază de date gazdă D