העברות בסיסי נתונים עם מעוף

1. הקדמה

מאמר זה מתאר מושגי מפתח של דרך טיסה וכיצד נוכל להשתמש במסגרת זו כדי לשפץ באופן שוטף את סכימת מסדי הנתונים של היישום שלנו באופן אמין וקל. בסוף נציג דוגמה לניהול מסד נתונים H2 בזיכרון באמצעות תוסף Maven Flyway.

Flyway מעדכן מסד נתונים מגרסה אחת לאחרת באמצעות העברות. אנו יכולים לכתוב הגירות ב- SQL עם תחביר ספציפי למסד נתונים או ב- Java לצורך שינויי מסד נתונים מתקדמים.

ניתן לבצע גרסאות או ניתן לחזור עליהן. לשעבר יש גרסה ייחודית והוא מוחל בדיוק פעם אחת. לאחרון אין גרסה. במקום זאת, הם מוחלים (מחדש) בכל פעם שסכום הבדיקה שלהם משתנה.

בתוך ריצת העברה אחת, הגירות הניתנות לחזרה מוחלות תמיד אחרונות, לאחר שבוצעו העברות גרסאות ממתינות. הגירות הניתנות לחזרה מיושמות לפי סדר התיאור שלהן. עבור העברה אחת, כל ההצהרות מופעלות במסגרת עסקת מסד נתונים אחת.

במאמר זה אנו מתמקדים בעיקר כיצד אנו עשויים להשתמש בתוסף Maven לביצוע העברות מסד נתונים.

2. תוסף Flyway Maven

להתקנת תוסף Flyway Maven, בואו נוסיף להגדרת התוסף הבאה שלנו pom.xml:

 org.flywaydb flyway-maven-plugin 4.0.3 

אנו יכולים לבדוק את הגרסה האחרונה של התוסף הזמין ב- Maven Central.

ניתן להגדיר תוסף Maven זה בארבע דרכים שונות. אנא עיין בתיעוד לקבלת רשימה של כל המאפיינים הניתנים להגדרה.

2.1. תצורת התוסף

אנו עשויים להגדיר את התוסף ישירות דרך ה- תג בהגדרת התוסף שלנו pom.xml:

 org.flywaydb flyway-maven-plugin 4.0.3 database בסיס נתונים משתמש סכימת סיסמה שם ... 

2.2. נכסים Maven

אנו עשויים גם להגדיר את התוסף על ידי ציון מאפיינים הניתנים להגדרה כ- Maven נכסים בפום שלנו:

 ... בסיס נתונים בסיס נתונים למשתמש סכימת סיסמה שם ... ... 

2.3. קובץ תצורה חיצוני

אנו עשויים גם לספק תצורת תוספים בנפרד .נכסים קוֹבֶץ:

flyway.user = databaseUser flyway.password = databasePassword flyway.schemas = schemaName ...

שם קובץ התצורה המוגדר כברירת מחדל הוא flyway.properties והוא אמור להיות באותה ספריה כמו pom.xml קוֹבֶץ. קידוד מוגדר על ידי flyway. קידוד (ברירת המחדל היא UTF-8).

אם אתה משתמש בשם אחר כלשהו (למשל customConfig.properties) כקובץ התצורה, יש לציין זאת במפורש בעת הפעלת פקודת Maven:

$ mvn -Dflyway.configFile = customConfig.properties

2.4. מאפייני מערכת

לבסוף, ניתן לציין את כל מאפייני התצורה גם כמאפייני מערכת בעת הפעלת Maven בשורת הפקודה:

$ mvn -Dflyway.user = databaseUser -Dflyway.password = databasePassword -Dflyway.schemas = schemaName

להלן סדר עדיפות כאשר תצורה מוגדרת ביותר מדרך אחת:

  1. מאפייני מערכת
  2. קובץ תצורה חיצוני
  3. נכסי Maven
  4. תצורת התוסף

3. דוגמת הגירה

בחלק זה אנו עוברים בשלבים הנדרשים להעברת סכימת מסד נתונים למסד נתונים H2 בזיכרון באמצעות התוסף Maven. אנו משתמשים בקובץ חיצוני כדי להגדיר את Flyway.

3.1. עדכן את POM

ראשית, בואו נוסיף H2 כתלות:

 com.h2database h2 1.4.196 

אנו יכולים לבדוק שוב את הגרסה האחרונה של מנהל ההתקן שזמינה ב- Maven Central. נוסיף גם את תוסף Flyway כפי שהוסבר קודם.

3.2. קבע את תצורת המעוף באמצעות קובץ חיצוני

לאחר מכן, אנו יוצרים myFlywayConfig.properties ב PROJECT_ROOT עם התוכן הבא:

flyway.user = databaseUser flyway.password = databasePassword flyway.schemas = app-db flyway.url = jdbc: h2: mem: DATABASE flyway.locations = מערכת קבצים: db / migration

התצורה שלעיל מציינת כי סקריפטי ההעברה שלנו ממוקמים ב- db / הגירה מַדרִיך. הוא מתחבר למופע H2 בזיכרון באמצעות databaseUser ו databasePassword.

סכימת מסד הנתונים של היישומים היא app-db.

כמובן, אנחנו מחליפים flyway.user, flyway.password, ו flyway.url עם שם המשתמש שלנו, סיסמת מסד הנתונים וכתובת האתר של מסד הנתונים שלנו באופן הולם.

3.3. הגדר הגירה ראשונה

Flyway מקפיד על מוסכמת השמות הבאה עבור סקריפטים של הגירה:

__. מ"ר

איפה:

  • - קידומת ברירת המחדל היא ו, אשר עשוי להיות מוגדר בקובץ התצורה לעיל באמצעות ה- flyway.sqlMigrationPrefix תכונה.
  • - מספר גרסת הגירה. גרסאות עיקריות וקטנות עשויות להיות מופרדות באמצעות מדגיש. גרסת ההעברה צריכה להתחיל תמיד עם 1.
  • - תיאור טקסטואלי של ההגירה. יש להפריד את התיאור ממספרי הגרסאות באמצעות קו תחתון כפול.

דוגמא: V1_1_0__my_first_migration.sql

אז בואו ניצור ספריה db / הגירה ב PROJECT_ROOT עם סקריפט הגירה בשם V1_0__create_employee_schema.sql המכיל הוראות SQL ליצירת טבלת העובדים:

צור טבלה אם לא קיים 'עובד' ('id' int לא NULL AUTO_INCREMENT מפתח עיקרי, 'שם' varchar (20), 'email' varchar (50), 'date_of_birth' חותמת זמן) מנוע = InnoDB ערך ברירת מחדל = UTF8;

3.4. לבצע הגירות

לאחר מכן, אנו מפעילים את פקודת Maven הבאה מ- PROJECT_ROOT לביצוע העברות מסדי נתונים:

נתיב טיסה נקי של $ mvn: migrate -Dflyway.configFile = myFlywayConfig.properties

זה אמור לגרום להעברה המוצלחת הראשונה שלנו.

כעת יש לתאר את סכמת מסד הנתונים כדלקמן:

עובד: + ---- + ------ + ------- + --------------- + | מזהה | שם | דוא"ל | תאריך_לידה | + ---- + ------ + ------- + --------------- +

אנו יכולים לחזור על שלבי הגדרה וביצוע כדי לבצע הגירות נוספות.

3.5. הגדר וביצע הגירה שנייה

בואו נראה איך נראית העברה שנייה על ידי יצירת קובץ העברה שני עם שם V2_0_create_department_schema.sql המכיל את שתי השאילתות הבאות:

צור טבלה אם לא קיים 'מחלקה' ('id' int לא NULL AUTO_INCREMENT PRIMARY KEY, `name` varchar (20)) ENGINE = InnoDB Default Default Charts = UTF8; שנה את הטבלה 'עובד' הוסף 'dept_id' לאחר 'דוא"ל';

נבצע הגירה דומה כמו בפעם הראשונה.

ועכשיו, סכימת מסדי הנתונים שלנו השתנתה כך שתוסיף עמודה חדשה עוֹבֵד וטבלה חדשה:

עובד: + ---- + ------ + ------- + --------- + --------------- + | מזהה | שם | דוא"ל | dept_id | תאריך_לידה | + ---- + ------ + ------- + --------- + --------------- +
מחלקה: + ---- + ------ + | מזהה | שם | + ---- + ------ +

כעת אנו עשויים לוודא ששתי ההעברות אכן צלחו על ידי הפעלת פקודת Maven הבאה:

נתיב טיסה של $ mvn: info -Dflyway.configFile = myFlywayConfig.properties

4. השבתת מעוף במגף האביב

לפעמים אולי נצטרך להשבית נדידות תעופה בנסיבות מסוימות.

לדוגמא, מקובל ליצור סכימת מסדי נתונים המבוססת על הגופים במהלך הבדיקות. במצב כזה, אנו יכולים להשבית את Flyway תחת ה- מִבְחָן פּרוֹפִיל.

בוא נראה כמה קל באביב המגף.

4.1. מגף קפיץ 1.x

כל מה שאנחנו צריכים לעשות זה לעשות הגדר את flyway. מופעל נכס שלנו יישומי- test.properties קוֹבֶץ:

flyway.enabled = שקר

4.2. מגף קפיץ 2.x

בגרסאות האחרונות של Spring Boot, נכס זה שונה ל- spring.flyway.enabled:

spring.flyway.enabled = false

4.3 ריק FlywayMigrationStrategy

אם אנחנו רק רוצים השבת העברת Flyway אוטומטית בעת ההפעלה, אך עדיין תוכל להפעיל את ההגירה באופן ידני, ואז השימוש במאפיינים שתוארו לעיל אינו בחירה טובה.

הסיבה לכך היא שבמצב כזה האביב אתחול לא יגדיר אוטומטית את ה- דרך טיסה שעועית יותר. כתוצאה מכך, נצטרך לספק את זה בעצמנו וזה לא מאוד נוח.

אז אם זה מקרה השימוש שלנו, נוכל להשאיר את Flyway מופעלת וליישם ריק FlywayMigrationStrategy:

@Configuration מחלקה ציבורית EmptyMigrationStrategyConfig {@Bean FlywayMigrationStrategy flywayMigrationStrategy () {מסלול חזרה -> {// לא לעשות כלום}; }}

זה יעיל השבת את העברת Flyway בעת הפעלת היישום.

אך עדיין נוכל להפעיל את ההגירה באופן ידני:

@RunWith (SpringRunner.class) @SpringBootTest מחלקה ציבורית ManualFlywayMigrationIntegrationTest {@ מסלול תעופה פרטי פרטי מאושר; @Test ציבורי בטל skipAutomaticAndTriggerManualFlywayMigration () {flyway.migrate (); }}

5. איך עובד מעוף

כדי לעקוב אחר אילו הגירות כבר הוחלו, מתי ועל ידי מי, זה מוסיף טבלת הנהלת חשבונות לסכמה שלך. טבלת מטא נתונים זו עוקבת אחר סיכומי בדיקת הגירה והאם ההעברות הצליחו או לא.

המסגרת מבצעת את השלבים הבאים כדי להתאים לסכימות מסדי נתונים מתפתחות:

  1. הוא בודק סכימת מסד נתונים כדי לאתר את טבלת המטא נתונים שלה (SCHEMA_VERSION כברירת מחדל). אם טבלת המטא נתונים אינה קיימת, היא תיצור אותה
  2. הוא סורק מסלול כיתה של אפליקציות לאיתור העברות זמינות
  3. זה משווה הגירות עם טבלת המטא נתונים. אם מספר גרסה נמוך או שווה לגרסה המסומנת כנוכחית, הוא מתעלם
  4. הוא מסמן את כל המעברות שנותרו כהעברות בהמתנה. אלה ממוינים על פי מספר הגרסה ומבוצעים לפי הסדר
  5. כאשר כל העברה מוחלת, טבלת המטא נתונים מתעדכנת בהתאם

6. פקודות

Flyway תומך בפקודות הבסיסיות הבאות לניהול העברות מסדי נתונים.

  • מידע: מדפיס את המצב / הגרסה הנוכחית של סכימת מסד נתונים. הוא מדפיס אילו הגירות ממתינות, אילו הגירות הוחלו, מה הסטטוס של הגירות שהוחלו ומתי הוחלו.
  • להגר: מעביר סכימת מסד נתונים לגרסה הנוכחית. הוא סורק את מסלול הכיתה לאיתור העברות זמינות ומחיל העברות בהמתנה.
  • קו בסיס: בסיסי בסיס נתונים קיים, לא כולל כל ההעברות, כולל גרסת הבסיס. Baseline עוזר להתחיל עם Flyway במסד נתונים קיים. לאחר מכן ניתן ליישם הגירות חדשות באופן רגיל.
  • לְאַמֵת: מאמת את סכימת מסד הנתונים הנוכחית כנגד העברות זמינות.
  • לְתַקֵן: תיקון טבלת המטא נתונים.
  • לְנַקוֹת: מוריד את כל האובייקטים בסכמה מוגדרת. כל אובייקטי מסד הנתונים מושמדים. כמובן, לעולם אין להשתמש בניקיון במאגר ייצור כלשהו.

7. מסקנה

במאמר זה הראינו כיצד עובד Flyway וכיצד אנו יכולים להשתמש במסגרת זו כדי לשפץ את מאגר היישומים שלנו באופן אמין.

הקוד שמלווה מאמר זה זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found