บทความนี้แนะนำการใช้ Flyway for Springboot เพื่อเปิดใช้งานการโยกย้ายฐานข้อมูล มันถูกแบ่งปันกับคุณ รายละเอียดมีดังนี้:
ก่อนอื่นให้ฉันเข้าใจก่อนว่า Flyway ทำงานอย่างไร
ทางออกที่ง่ายที่สุดคือชี้ไปที่ฐานข้อมูลที่ว่างเปล่า
มันจะพยายามค้นหาตารางเมตาดาต้า เมื่อฐานข้อมูลว่างเปล่า Flyway จะไม่พบ แต่สร้างขึ้นมา ตอนนี้คุณมีฐานข้อมูลที่มีตารางว่างเปล่าเดียวชื่อ schema_version:
ตารางนี้จะถูกใช้เพื่อติดตามสถานะของฐานข้อมูล หลังจากนั้น Flyway จะเริ่มสแกนระบบไฟล์ของแอปพลิเคชันหรือ ClassPath สำหรับการย้ายถิ่น พวกเขาสามารถเขียนใน SQL หรือ Java
จากนั้นจัดเรียงการย้ายข้อมูลตามหมายเลขเวอร์ชันและใช้ตามลำดับ:
เมื่อใช้การโยกย้ายแต่ละครั้งตารางเมตาดาต้าจะได้รับการปรับปรุงตาม:
schema_version
ด้วยข้อมูลเมตาและสถานะเริ่มต้นในสถานที่ตอนนี้เราสามารถพูดคุยเกี่ยวกับการโยกย้ายไปยังเวอร์ชันใหม่
Flyway จะสแกนระบบไฟล์ของแอปพลิเคชันหรือ ClassPath อีกครั้งสำหรับการย้ายถิ่น ตรวจสอบการย้ายถิ่นกับตารางข้อมูลเมตา หากหมายเลขเวอร์ชันต่ำกว่าหรือเท่ากับหมายเลขเวอร์ชันที่ทำเครื่องหมายเป็นเวอร์ชันปัจจุบันพวกเขาจะถูกละเว้น
การอพยพที่เหลืออยู่กำลังรอการย้ายถิ่น: มีอยู่ แต่ไม่ได้ใช้
จากนั้นพวกเขาเรียงลำดับตามหมายเลขเวอร์ชันและดำเนินการในทางกลับกัน:
ตารางข้อมูลเมตานี้ได้รับการอัปเดตดังนั้น:
schema_version
แค่ไหน! เมื่อใดก็ตามที่คุณต้องการพัฒนาฐานข้อมูลไม่ว่าจะเป็นโครงสร้าง (DDL) หรือข้อมูลอ้างอิง (DML) เพียงสร้างการโยกย้ายใหม่ที่มีหมายเลขเวอร์ชันสูงกว่าเวอร์ชันปัจจุบัน ครั้งต่อไปที่ Flyway เริ่มต้นจะค้นพบและอัพเกรดฐานข้อมูลตามนั้น
2. การใช้ Flyway ใน Springboot
วิธีหนึ่งคือการตั้งค่าคุณสมบัติ hibernate.hbm2ddl.auto เพื่อสร้างสร้างการวางหรืออัปเดตผ่านคุณสมบัติ Spring.jpa.hibernate.ddl-Auto ของ Spring.hibernate.ddl-Auto ตัวอย่างเช่นในการตั้งค่า hibernate.hbm2ddl.auto เพื่อสร้าง Drop เราสามารถเพิ่มเนื้อหาต่อไปนี้ใน application.yml:
ฤดูใบไม้ผลิ: JPA: Hibernate: DDL-AUTO: Create-Drop
อย่างไรก็ตามสิ่งนี้ไม่เหมาะสำหรับสภาพแวดล้อมการผลิตเนื่องจากทุกครั้งที่แอปพลิเคชันรีสตาร์ทฐานข้อมูลสคีมาจะถูกทำให้ว่างเปล่าและสร้างใหม่ตั้งแต่เริ่มต้น สามารถตั้งค่าให้อัปเดตได้ แต่ถึงอย่างนั้นเราก็ไม่แนะนำให้ใช้สำหรับสภาพแวดล้อมการผลิต
มีอีกวิธีหนึ่ง เราสามารถกำหนดสคีมาใน schema.sql ในการเรียกใช้ครั้งแรกไม่มีปัญหาในการทำเช่นนี้ แต่ทุกครั้งที่แอปพลิเคชันเริ่มต้นสคริปต์การเริ่มต้นนี้ล้มเหลวเนื่องจากตารางข้อมูลมีอยู่แล้ว สิ่งนี้ต้องการการดูแลเป็นพิเศษเมื่อเขียนสคริปต์การเริ่มต้นและไม่ทำซ้ำงานที่ทำ
ตัวเลือกที่ดีกว่าคือการใช้ไลบรารีการโยกย้ายฐานข้อมูล มันใช้ชุดของสคริปต์ฐานข้อมูลและระเบียนที่ใช้และไม่ได้ใช้สคริปต์เดียวกันหลายครั้ง แต่ละแพ็คเกจการปรับใช้ของแอปพลิเคชันมีสคริปต์เหล่านี้และฐานข้อมูลสามารถสอดคล้องกับแอปพลิเคชัน Spring Boot ให้การรองรับการกำหนดค่าอัตโนมัติสำหรับไลบรารีการโยกย้ายฐานข้อมูลยอดนิยมสองรายการ
เมื่อคุณต้องการใช้หนึ่งในไลบรารีเหล่านี้ใน Spring Boot คุณเพียงแค่ต้องเพิ่มการพึ่งพาที่สอดคล้องกันในโครงการและเขียนสคริปต์ เริ่มต้นด้วย Flyway
1. ใช้ Flyway เพื่อกำหนดกระบวนการโยกย้ายฐานข้อมูล
Flyway เป็นไลบรารีการโยกย้ายฐานข้อมูลโอเพ่นซอร์สที่ง่ายมากที่ใช้ SQL เพื่อกำหนดสคริปต์การย้ายถิ่น แนวคิดคือแต่ละสคริปต์มีหมายเลขเวอร์ชันและ Flyway จะเรียกใช้สคริปต์เหล่านี้ตามลำดับเพื่อรับฐานข้อมูลไปยังสถานะที่ต้องการ นอกจากนี้ยังบันทึกสถานะสคริปต์ที่ดำเนินการและจะไม่ถูกทำซ้ำ ที่นี่ในแอปพลิเคชันรายการอ่านเราเริ่มต้นด้วยฐานข้อมูลที่ว่างเปล่าโดยไม่มีตารางข้อมูลและข้อมูล ดังนั้นสคริปต์นี้จำเป็นต้องสร้างตารางผู้อ่านและหนังสือก่อนรวมถึงข้อ จำกัด ของคีย์ต่างประเทศและข้อมูลการเริ่มต้น รายการ 8-2 ของรหัสเป็นสคริปต์ Flyway จากฐานข้อมูลที่ว่างเปล่าไปยังสถานะที่มีอยู่
สคริปต์เริ่มต้นฐานข้อมูล Flyway
สร้างตัวอ่านตาราง (คีย์หลักอนุกรม ID ชื่อผู้ใช้ VARCHAR (25) ไม่ซ้ำกันไม่ใช่ NULL, รหัสผ่าน VARCHAR (25) ไม่ใช่ NULL, FULLNAME VARCHAR (50) ไม่ใช่ NULL); สร้างหนังสือตาราง (คีย์หลักอนุกรม ID, ผู้แต่ง Varchar (50) ไม่ใช่ NULL, คำอธิบาย VARCHAR (1000) ไม่ใช่ NULL, ISBN VARCHAR (10) ไม่ใช่ NULL, ชื่อ VARCHAR (250) ไม่ใช่ NULL, Reader_USERNAME VARCHAR (25) ไม่ใช่ NULL, คีย์ต่างประเทศ (reader_username) สร้างลำดับ hibernate_equence; แทรกลงในตัวอ่าน (ชื่อผู้ใช้, รหัสผ่าน, fullName) ค่า ('Craig', 'รหัสผ่าน', 'Craig Walls'); อย่างที่คุณเห็นสคริปต์ Flyway คือ SQL สิ่งที่ทำให้มันใช้งานได้คือตำแหน่งและชื่อไฟล์ใน ClassPath สคริปต์ Flyway ทั้งหมดทำตามข้อกำหนดการตั้งชื่อที่มีหมายเลขเวอร์ชันดังแสดงในรูปที่ 8-1
สคริปต์ Flyway ทั้งหมดมีชื่อที่เริ่มต้นด้วยตัวอักษรตัวใหญ่ V ตามด้วยหมายเลขเวอร์ชันของสคริปต์ ตามด้วยสองขีด จำกัด และคำอธิบายของสคริปต์ เนื่องจากนี่เป็นสคริปต์แรกในกระบวนการโยกย้ายทั้งหมดเวอร์ชันของมันคือ 1 คำอธิบายสามารถยืดหยุ่นได้มากและส่วนใหญ่จะใช้เพื่อช่วยให้เข้าใจวัตถุประสงค์ของสคริปต์ หลังจากนั้นเราจำเป็นต้องเพิ่มตารางใหม่ลงในฐานข้อมูลหรือเพิ่มฟิลด์ใหม่ลงในตารางข้อมูลที่มีอยู่ คุณสามารถสร้างสคริปต์อื่นด้วยหมายเลขเวอร์ชัน 2 สคริปต์ Flyway จะต้องวางไว้ภายใต้เส้นทาง /db /การย้ายถิ่นที่สัมพันธ์กับเส้นทางรูทคลาส Classpath ของแอปพลิเคชัน ดังนั้นในโครงการสคริปต์จะต้องวางไว้ใน SRC/Main/Resources/DB/การย้ายถิ่น คุณต้องตั้งค่า Spring.jpa.hibernate.ddl-Auto เป็นไม่มีดังนั้น Hebernate จะไม่สร้างตารางข้อมูล สิ่งนี้เกี่ยวข้องกับเนื้อหาต่อไปนี้ใน application.yml:
ฤดูใบไม้ผลิ: JPA: Hibernate: DDL-AUTO: NONE
สิ่งที่เหลืออยู่คือการเพิ่ม Flyway เป็นการพึ่งพาโครงการ ใน Gradle การพึ่งพานี้มีลักษณะเช่นนี้:
Compile ("org.flywaydb: Flyway-Core")ในโครงการ Maven ดูเหมือนว่า:
<การพึ่งพา> <roupId> org.flywayfb </groupId> <ratifactid> Flyway-core </artifactid>
หลังจากการปรับใช้แอปพลิเคชันและเรียกใช้สปริงบูตจะตรวจจับ Flyway ใน ClassPath และกำหนดค่าถั่วที่ต้องการโดยอัตโนมัติ Flyway จะดูสคริปต์ใน /db /การย้ายถิ่นในทางกลับกันและเรียกใช้สคริปต์เหล่านี้หากพวกเขายังไม่ได้ดำเนินการ หลังจากดำเนินการแต่ละสคริปต์ให้เขียนบันทึกลงในตาราง schema_version ครั้งต่อไปที่แอปพลิเคชันเริ่มต้น Flyway จะดูบันทึกใน schema_version ก่อนและข้ามสคริปต์เหล่านั้น
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น