Dbmate เป็นเครื่องมือย้ายฐานข้อมูลที่จะทำให้สคีมาฐานข้อมูลของคุณซิงค์ระหว่างนักพัฒนาหลายรายและเซิร์ฟเวอร์ที่ใช้งานจริงของคุณ
เป็นเครื่องมือบรรทัดคำสั่งแบบสแตนด์อโลนที่สามารถใช้กับ Go, Node.js, Python, Ruby, PHP, Rust, C++ หรือภาษาหรือเฟรมเวิร์กอื่น ๆ ที่คุณใช้ในการเขียนแอปพลิเคชันที่สนับสนุนฐานข้อมูล สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณเขียนบริการหลายภาษาในภาษาต่างๆ และต้องการรักษาสุขภาพที่ดีด้วยเครื่องมือการพัฒนาที่สอดคล้องกัน
สำหรับการเปรียบเทียบระหว่าง dbmate กับเครื่องมือการย้ายสคีมาฐานข้อมูลยอดนิยมอื่นๆ โปรดดูทางเลือกอื่น
schema.sql
เพื่อกระจายการเปลี่ยนแปลงสคีมาใน git ได้อย่างง่ายดายDATABASE_URL
ตามค่าเริ่มต้น) หรือระบุไว้ในบรรทัดคำสั่ง.env
ของคุณนพีเอ็ม
ติดตั้งโดยใช้ NPM:
npm install --save-dev dbmate
npx dbmate --help
ระบบปฏิบัติการ macOS
ติดตั้งโดยใช้ Homebrew:
brew install dbmate
dbmate --help
ลินุกซ์
ติดตั้งไบนารีโดยตรง:
sudo curl -fsSL -o /usr/local/bin/dbmate https://github.com/amacneil/dbmate/releases/latest/download/dbmate-linux-amd64
sudo chmod +x /usr/local/bin/dbmate
/usr/local/bin/dbmate --help
หน้าต่าง
ติดตั้งโดยใช้ Scoop
scoop install dbmate
dbmate -- help
นักเทียบท่า
อิมเมจ Docker ได้รับการเผยแพร่ไปยัง GitHub Container Registry ( ghcr.io/amacneil/dbmate
)
อย่าลืมตั้งค่า --network=host
หรือดูความคิดเห็นนี้สำหรับเคล็ดลับเพิ่มเติมเกี่ยวกับการใช้ dbmate กับเครือข่ายนักเทียบท่า):
docker run --rm -it --network=host ghcr.io/amacneil/dbmate --help
หากคุณต้องการสร้างหรือใช้การย้ายข้อมูล คุณจะต้องใช้คุณสมบัติการเชื่อมของ Docker เพื่อทำให้ไดเร็กทอรีการทำงานในเครื่องของคุณ ( pwd
) พร้อมใช้งานภายในคอนเทนเนอร์ dbmate:
docker run --rm -it --network=host -v " $( pwd ) /db:/db " ghcr.io/amacneil/dbmate new create_users_table
dbmate --help # print usage help
dbmate new # generate a new migration file
dbmate up # create the database (if it does not already exist) and run any pending migrations
dbmate create # create the database
dbmate drop # drop the database
dbmate migrate # run any pending migrations
dbmate rollback # roll back the most recent migration
dbmate down # alias for rollback
dbmate status # show the status of all migrations (supports --exit-code and --quiet)
dbmate dump # write the database schema.sql file
dbmate load # load schema.sql file to the database
dbmate wait # wait for the database server to become available
ตัวเลือกต่อไปนี้ใช้ได้กับทุกคำสั่ง คุณต้องใช้อาร์กิวเมนต์บรรทัดคำสั่งตามลำดับ dbmate [global options] command [command options]
ตัวเลือกส่วนใหญ่สามารถกำหนดค่าผ่านตัวแปรสภาพแวดล้อมได้ (และโหลดจากไฟล์ .env
ของคุณ ซึ่งมีประโยชน์ในการแชร์การกำหนดค่าระหว่างสมาชิกในทีม)
--url, -u "protocol://host:port/dbname"
- ระบุ URL ฐานข้อมูลโดยตรง (สภาพแวดล้อม: DATABASE_URL
)--env, -e "DATABASE_URL"
- ระบุตัวแปรสภาพแวดล้อมเพื่ออ่าน URL การเชื่อมต่อฐานข้อมูล--env-file ".env"
- ระบุไฟล์ตัวแปรสภาพแวดล้อมสำรองที่จะโหลด--migrations-dir, -d "./db/migrations"
- ตำแหน่งที่จะเก็บไฟล์การโยกย้าย (สภาพแวดล้อม: DBMATE_MIGRATIONS_DIR
)--migrations-table "schema_migrations"
- ตารางฐานข้อมูลสำหรับบันทึกการย้ายข้อมูล (env: DBMATE_MIGRATIONS_TABLE
)--schema-file, -s "./db/schema.sql"
- เส้นทางสำหรับเก็บไฟล์ schema.sql (สภาพแวดล้อม: DBMATE_SCHEMA_FILE
)--no-dump-schema
- อย่าอัปเดตไฟล์ schema.sql โดยอัตโนมัติเมื่อโยกย้าย / ย้อนกลับ (env: DBMATE_NO_DUMP_SCHEMA
)--strict
- ล้มเหลวหากการย้ายข้อมูลถูกนำไปใช้อย่างไม่เป็นระเบียบ (env: DBMATE_STRICT
)--wait
- รอให้ db พร้อมใช้งานก่อนดำเนินการคำสั่งถัดไป (env: DBMATE_WAIT
)--wait-timeout 60s
- หมดเวลาสำหรับ --wait flag (env: DBMATE_WAIT_TIMEOUT
) Dbmate ค้นหาฐานข้อมูลของคุณโดยใช้ตัวแปรสภาพแวดล้อม DATABASE_URL
ตามค่าเริ่มต้น หากคุณกำลังเขียนแอปสิบสองปัจจัย คุณควรจัดเก็บสตริงการเชื่อมต่อทั้งหมดในตัวแปรสภาพแวดล้อม
เพื่อให้การพัฒนานี้ง่ายขึ้น dbmate จะค้นหาไฟล์ .env
ในไดเร็กทอรีปัจจุบัน และถือว่าตัวแปรใดๆ ที่อยู่ในรายการนั้นเหมือนกับว่าถูกระบุไว้ในสภาพแวดล้อมปัจจุบัน (อย่างไรก็ตาม ตัวแปรสภาพแวดล้อมที่มีอยู่จะได้รับการพิจารณาเป็นพิเศษ)
หากคุณยังไม่มีไฟล์ .env
ให้สร้างไฟล์และเพิ่ม URL การเชื่อมต่อฐานข้อมูลของคุณ:
$ cat .env
DATABASE_URL= " postgres://[email protected]:5432/myapp_development?sslmode=disable "
ควรระบุ DATABASE_URL
ในรูปแบบต่อไปนี้:
protocol://username:password@host:port/database_name?options
protocol
จะต้องเป็นหนึ่งใน mysql
, postgres
, postgresql
, sqlite
, sqlite3
, clickhouse
username
และ password
จะต้องเข้ารหัส URL (คุณจะได้รับข้อผิดพลาดหากคุณใช้อักขระพิเศษ)host
สามารถเป็นได้ทั้งชื่อโฮสต์หรือที่อยู่ IPoptions
เป็นไดรเวอร์เฉพาะ (อ้างอิงถึงไดรเวอร์ Go SQL พื้นฐานหากคุณต้องการใช้สิ่งเหล่านี้) Dbmate ยังสามารถโหลด URL การเชื่อมต่อจากตัวแปรสภาพแวดล้อมอื่นได้ ตัวอย่างเช่น ก่อนที่จะรันชุดทดสอบ คุณอาจต้องการทิ้งและสร้างฐานข้อมูลทดสอบใหม่ วิธีง่ายๆ วิธีหนึ่งในการทำเช่นนี้คือจัดเก็บ URL การเชื่อมต่อฐานข้อมูลทดสอบของคุณในตัวแปรสภาพแวดล้อม TEST_DATABASE_URL
:
$ cat .env
DATABASE_URL= " postgres://[email protected]:5432/myapp_dev?sslmode=disable "
TEST_DATABASE_URL= " postgres://[email protected]:5432/myapp_test?sslmode=disable "
จากนั้น คุณสามารถระบุตัวแปรสภาพแวดล้อมนี้ในสคริปต์ทดสอบของคุณ (Makefile หรือที่คล้ายกัน):
$ dbmate -e TEST_DATABASE_URL drop
Dropping: myapp_test
$ dbmate -e TEST_DATABASE_URL --no-dump-schema up
Creating: myapp_test
Applying: 20151127184807_create_users_table.sql
Applied: 20151127184807_create_users_table.sql in 123µs
หรือคุณสามารถระบุ URL ได้โดยตรงบนบรรทัดคำสั่ง:
$ dbmate -u " postgres://[email protected]:5432/myapp_test?sslmode=disable " up
ข้อได้เปรียบเพียงอย่างเดียวของการใช้ dbmate -e TEST_DATABASE_URL
บน dbmate -u $TEST_DATABASE_URL
คือแบบแรกใช้ประโยชน์จากการโหลดไฟล์ . .env
อัตโนมัติของ dbmate
เมื่อเชื่อมต่อกับ Postgres คุณอาจต้องเพิ่มตัวเลือก sslmode=disable
ให้กับสตริงการเชื่อมต่อของคุณ เนื่องจากตามค่าเริ่มต้น dbmate ต้องใช้การเชื่อมต่อ TLS (เฟรมเวิร์ก/ภาษาอื่นๆ บางตัวอนุญาตการเชื่อมต่อที่ไม่ได้เข้ารหัสตามค่าเริ่มต้น)
DATABASE_URL= " postgres://username:[email protected]:5432/database_name?sslmode=disable "
สามารถระบุ socket
หรือพารามิเตอร์ host
เพื่อเชื่อมต่อผ่านซ็อกเก็ตยูนิกซ์ได้ (หมายเหตุ: ระบุไดเร็กทอรีเท่านั้น):
DATABASE_URL= " postgres://username:password@/database_name?socket=/var/run/postgresql "
พารามิเตอร์ search_path
สามารถใช้เพื่อระบุสคีมาปัจจุบันในขณะที่ใช้การย้ายข้อมูล เช่นเดียวกับตาราง schema_migrations
ของ dbmate หากไม่มีสคีมา สคีมาจะถูกสร้างขึ้นโดยอัตโนมัติ หากมีการส่งสคีมาที่คั่นด้วยเครื่องหมายจุลภาคหลายรายการ สคีมาแรกจะถูกใช้สำหรับตาราง schema_migrations
DATABASE_URL= " postgres://username:[email protected]:5432/database_name?search_path=myschema "
DATABASE_URL= " postgres://username:[email protected]:5432/database_name?search_path=myschema,public "
DATABASE_URL= " mysql://username:[email protected]:3306/database_name "
สามารถระบุพารามิเตอร์ socket
เพื่อเชื่อมต่อผ่านซ็อกเก็ตยูนิกซ์:
DATABASE_URL= " mysql://username:password@/database_name?socket=/var/run/mysqld/mysqld.sock "
ฐานข้อมูล SQLite จะถูกจัดเก็บไว้ในระบบไฟล์ ดังนั้นคุณไม่จำเป็นต้องระบุโฮสต์ ตามค่าเริ่มต้น ไฟล์จะสัมพันธ์กับไดเร็กทอรีปัจจุบัน ตัวอย่างเช่นต่อไปนี้จะสร้างฐานข้อมูลที่ ./db/database.sqlite3
:
DATABASE_URL= " sqlite:db/database.sqlite3 "
หากต้องการระบุเส้นทางที่แน่นอน ให้เพิ่มเครื่องหมายทับให้กับเส้นทาง ต่อไปนี้จะสร้างฐานข้อมูลที่ /tmp/database.sqlite3
:
DATABASE_URL= " sqlite:/tmp/database.sqlite3 "
DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name "
ในการทำงานกับคลัสเตอร์ ClickHouse มีพารามิเตอร์การสืบค้นการเชื่อมต่อ 4 แบบที่สามารถระบุได้:
on_cluster
- บ่งชี้ให้ใช้คำสั่งคลัสเตอร์และตารางการโยกย้ายที่จำลองแบบ (ค่าเริ่มต้น: false
) หากไม่ได้ระบุพารามิเตอร์นี้ พารามิเตอร์เคียวรีที่เกี่ยวข้องกับคลัสเตอร์อื่นๆ จะถูกละเว้น DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster "
DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster=true "
cluster_macro
(ไม่บังคับ) - ค่ามาโครที่จะใช้สำหรับคำสั่ง ON CLUSTER และสำหรับเส้นทางผู้ดูแลสวนสัตว์ของกลไกตารางการโยกย้ายที่ทำซ้ำ (ค่าเริ่มต้น: {cluster}
) DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster&cluster_macro={my_cluster} "
replica_macro
(ไม่บังคับ) - ค่ามาโครที่จะใช้สำหรับชื่อเรพลิกาในกลไกจัดการตารางการย้ายข้อมูลที่ถูกจำลอง (ค่าเริ่มต้น: {replica}
) DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster&replica_macro={my_replica} "
zoo_path
(ไม่บังคับ) - เส้นทางไปยังการย้ายตารางใน ClickHouse/Zoo Keeper (ค่าเริ่มต้น: /clickhouse/tables/<cluster_macro>/{table}
) DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster&zoo_path=/zk/path/tables "
ดูตัวเลือกการเชื่อมต่ออื่นๆ ที่รองรับ
ทำตามรูปแบบต่อไปนี้สำหรับ DATABASE_URL
เมื่อเชื่อมต่อกับ BigQuery จริงใน GCP:
bigquery://projectid/location/dataset
projectid
(จำเป็น) - รหัสโครงการ
dataset
(บังคับ) - ชื่อชุดข้อมูลภายในโครงการ
location
(ไม่บังคับ) - ตำแหน่งที่สร้างชุดข้อมูล
หมายเหตุ: ปฏิบัติตามเอกสารนี้เกี่ยวกับวิธีการตั้งค่าตัวแปรสภาพแวดล้อม GOOGLE_APPLICATION_CREDENTIALS
เพื่อการตรวจสอบสิทธิ์ที่เหมาะสม
ทำตามรูปแบบต่อไปนี้หากพยายามเชื่อมต่อกับปลายทางที่กำหนดเอง เช่น BigQuery Emulator
bigquery://host:port/projectid/location/dataset?disable_auth=true
disable_auth
(ไม่บังคับ) - ส่งค่า true
เพื่อข้ามการตรวจสอบสิทธิ์ ใช้สำหรับการทดสอบและเชื่อมต่อกับโปรแกรมจำลองเท่านั้น
ขณะนี้การสนับสนุน Spanner จำกัดเฉพาะฐานข้อมูลที่ใช้ PostgreSQL Dialect ซึ่งจะต้องเลือกระหว่างการสร้างฐานข้อมูล สำหรับ Spanner ในอนาคตที่รองรับ GoogleSQL โปรดดูการสนทนานี้
Spanner ที่มีอินเทอร์เฟซ Postgres ต้องการให้ PGAdapter ทำงานอยู่ ใช้รูปแบบต่อไปนี้สำหรับ DATABASE_URL
โดยโฮสต์และพอร์ตตั้งค่าเป็นตำแหน่งที่ PGAdapter กำลังทำงาน:
DATABASE_URL= " spanner-postgres://127.0.0.1:5432/database_name?sslmode=disable "
โปรดทราบว่าไม่จำเป็นต้องระบุชื่อผู้ใช้และรหัสผ่าน เนื่องจาก PGAdapter จะจัดการการตรวจสอบสิทธิ์ (PGAdapter จะละเว้นหากระบุไว้)
รองรับตัวเลือกอื่นๆ ของไดรเวอร์ postgres
Spanner ยังไม่อนุญาตให้ดำเนินการ DDL ภายในธุรกรรมที่ชัดเจน ดังนั้นคุณต้องระบุ transaction:false
ในการย้ายข้อมูลที่มี DDL:
-- migrate:up transaction:false
CREATE TABLE ...
-- migrate:down transaction:false
DROP TABLE ...
ขณะนี้ยังไม่รองรับ Schema dumps เนื่องจาก pg_dump
ใช้ฟังก์ชันที่ Spanner ไม่ได้จัดเตรียมไว้ให้
หากต้องการสร้างการย้ายข้อมูลใหม่ ให้รัน dbmate new create_users_table
คุณสามารถตั้งชื่อการย้ายข้อมูลได้ตามต้องการ สิ่งนี้จะสร้างไฟล์ db/migrations/20151127184807_create_users_table.sql
ในไดเร็กทอรีปัจจุบัน:
-- migrate:up
-- migrate:down
หากต้องการเขียนการโยกย้าย เพียงเพิ่ม SQL ของคุณไปยังส่วน migrate:up
:
-- migrate:up
create table users (
id integer ,
name varchar ( 255 ),
email varchar ( 255 ) not null
);
-- migrate:down
หมายเหตุ: ไฟล์การย้ายข้อมูลจะมีชื่ออยู่ในรูปแบบ
[version]_[description].sql
เฉพาะเวอร์ชัน (ซึ่งกำหนดเป็นอักขระตัวเลขนำหน้าทั้งหมดในชื่อไฟล์) เท่านั้นที่จะถูกบันทึกไว้ในฐานข้อมูล ดังนั้นคุณจึงสามารถเปลี่ยนชื่อไฟล์การย้ายข้อมูลได้อย่างปลอดภัย โดยไม่ส่งผลต่อสถานะแอปพลิเคชันปัจจุบัน
เรียกใช้ dbmate up
เพื่อเรียกใช้การโยกย้ายที่ค้างอยู่
$ dbmate up
Creating: myapp_development
Applying: 20151127184807_create_users_table.sql
Applied: 20151127184807_create_users_table.sql in 123µs
Writing: ./db/schema.sql
หมายเหตุ:
dbmate up
จะสร้างฐานข้อมูลหากไม่มีอยู่ (สมมติว่าผู้ใช้ปัจจุบันมีสิทธิ์ในการสร้างฐานข้อมูล) หากคุณต้องการเรียกใช้การย้ายข้อมูลโดยไม่ต้องสร้างฐานข้อมูล ให้เรียกใช้dbmate migrate
การโยกย้ายที่รอดำเนินการจะใช้ตามลำดับตัวเลขเสมอ อย่างไรก็ตาม dbmate ไม่ได้ป้องกันการโยกย้ายจากการใช้ผิดลำดับหากพวกเขากระทำโดยอิสระ (เช่น: หากนักพัฒนาทำงานในสาขามาเป็นเวลานาน และกระทำการโยกย้ายซึ่งมีหมายเลขเวอร์ชันต่ำกว่าอื่น ๆ อยู่แล้ว- การโยกย้ายที่ใช้ dbmate จะใช้การโยกย้ายที่รอดำเนินการ) ดู #159 สำหรับคำอธิบายโดยละเอียดเพิ่มเติม
ตามค่าเริ่มต้น dbmate จะไม่รู้วิธีย้อนกลับการโยกย้าย ในการพัฒนา การเปลี่ยนฐานข้อมูลของคุณกลับเป็นสถานะก่อนหน้ามักจะมีประโยชน์ เพื่อให้บรรลุเป้าหมายนี้ ให้ใช้ส่วน migrate:down
:
-- migrate:up
create table users (
id integer ,
name varchar ( 255 ),
email varchar ( 255 ) not null
);
-- migrate:down
drop table users;
เรียกใช้ dbmate rollback
เพื่อย้อนกลับการโยกย้ายล่าสุด:
$ dbmate rollback
Rolling back: 20151127184807_create_users_table.sql
Rolled back: 20151127184807_create_users_table.sql in 123µs
Writing: ./db/schema.sql
dbmate รองรับตัวเลือกที่ส่งไปยังบล็อกการโยกย้ายในรูปแบบของ key:value
รายการตัวเลือกที่รองรับ:
transaction
ธุรกรรม
transaction
มีประโยชน์หากคุณไม่ต้องการรัน SQL ภายในธุรกรรม:
-- migrate:up transaction:false
ALTER TYPE colors ADD VALUE ' orange ' AFTER ' red ' ;
transaction
จะมีค่าเริ่มต้นเป็น true
หากฐานข้อมูลของคุณรองรับ
หากคุณใช้สภาพแวดล้อมการพัฒนา Docker สำหรับโปรเจ็กต์ของคุณ คุณอาจประสบปัญหากับฐานข้อมูลไม่พร้อมทันทีเมื่อเรียกใช้การย้ายข้อมูลหรือการทดสอบหน่วย อาจเนื่องมาจากเซิร์ฟเวอร์ฐานข้อมูลเพิ่งเริ่มต้นเท่านั้น
โดยทั่วไป แอปพลิเคชันของคุณควรมีความยืดหยุ่นต่อการไม่มีการเชื่อมต่อฐานข้อมูลที่ใช้งานได้เมื่อเริ่มต้นระบบ อย่างไรก็ตาม เพื่อวัตถุประสงค์ในการรันการโยกย้ายหรือการทดสอบหน่วย สิ่งนี้ไม่สามารถทำได้ คำสั่ง wait
หลีกเลี่ยงสถานการณ์นี้โดยอนุญาตให้คุณหยุดสคริปต์หรือแอปพลิเคชันอื่นชั่วคราวจนกว่าฐานข้อมูลจะพร้อมใช้งาน Dbmate จะพยายามเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูลทุกๆ วินาที สูงสุด 60 วินาที
หากฐานข้อมูลพร้อมใช้งาน wait
จะไม่ส่งคืนเอาต์พุต:
$ dbmate wait
หากฐานข้อมูลไม่พร้อมใช้งาน wait
เพื่อบล็อกจนกว่าฐานข้อมูลจะพร้อมใช้งาน:
$ dbmate wait
Waiting for database....
คุณยังสามารถใช้แฟล็ก --wait
ร่วมกับคำสั่งอื่นๆ ได้ หากบางครั้งคุณพบความล้มเหลวที่เกิดจากฐานข้อมูลยังไม่พร้อม:
$ dbmate --wait up
Waiting for database....
Creating: myapp_development
คุณสามารถปรับแต่งการหมดเวลาได้โดยใช้ --wait-timeout
(ค่าเริ่มต้น 60 วินาที) หากฐานข้อมูลยังไม่พร้อมใช้งาน คำสั่งจะส่งกลับข้อผิดพลาด:
$ dbmate --wait-timeout=5s wait
Waiting for database.....
Error: unable to connect to database: dial tcp 127.0.0.1:5432: connect: connection refused
โปรดทราบว่าคำสั่ง wait
จะไม่ตรวจสอบว่าฐานข้อมูลที่คุณระบุมีอยู่หรือไม่ เพียงแต่ว่าเซิร์ฟเวอร์พร้อมใช้งานและพร้อมใช้งาน (ดังนั้นคำสั่งจะส่งคืนความสำเร็จหากเซิร์ฟเวอร์ฐานข้อมูลพร้อมใช้งาน แต่ยังไม่ได้สร้างฐานข้อมูลของคุณ)
เมื่อคุณเรียกใช้คำสั่ง up
, migrate
หรือ rollback
dbmate จะสร้างไฟล์ ./db/schema.sql
โดยอัตโนมัติซึ่งมีการนำเสนอสกีมาฐานข้อมูลของคุณโดยสมบูรณ์ Dbmate จะคอยอัปเดตไฟล์นี้ให้กับคุณ ดังนั้นคุณจึงไม่ควรแก้ไขไฟล์ด้วยตนเอง
ขอแนะนำให้ตรวจสอบไฟล์นี้ในการควบคุมแหล่งที่มา เพื่อให้คุณสามารถตรวจสอบการเปลี่ยนแปลงในสคีมาในการคอมมิตหรือคำขอดึงได้อย่างง่ายดาย นอกจากนี้ยังสามารถใช้ไฟล์นี้เมื่อคุณต้องการโหลดสคีมาฐานข้อมูลอย่างรวดเร็ว โดยไม่ต้องดำเนินการย้ายข้อมูลแต่ละครั้งตามลำดับ (เช่น ในชุดทดสอบของคุณ) อย่างไรก็ตาม หากคุณไม่ต้องการบันทึกไฟล์นี้ คุณสามารถเพิ่มมันลงใน .gitignore
ของคุณ หรือส่งตัวเลือกบรรทัดคำสั่ง --no-dump-schema
หากต้องการดัมพ์ไฟล์ schema.sql
โดยไม่ดำเนินการใดๆ ให้รัน dbmate dump
ไม่เหมือนกับการกระทำของ dbmate อื่นๆ คำสั่งนี้อาศัยคำสั่ง pg_dump
, mysqldump
หรือ sqlite3
ที่เกี่ยวข้องซึ่งมีอยู่ใน PATH ของคุณ หากไม่มีเครื่องมือเหล่านี้ dbmate จะข้ามขั้นตอนดัมพ์ของสคีมาอย่างเงียบๆ ในระหว่างการดำเนินการ up
migrate
หรือ rollback
คุณสามารถวินิจฉัยปัญหาได้ด้วยการรัน dbmate dump
และดูผลลัพธ์:
$ dbmate dump
exec: " pg_dump " : executable file not found in $PATH
บนระบบ Ubuntu หรือ Debian คุณสามารถแก้ไขได้โดยการติดตั้ง postgresql-client
, mysql-client
หรือ sqlite3
ตามลำดับ ตรวจสอบให้แน่ใจว่าเวอร์ชันแพ็คเกจที่คุณติดตั้งมากกว่าหรือเท่ากับเวอร์ชันที่ทำงานบนเซิร์ฟเวอร์ฐานข้อมูลของคุณ
หมายเหตุ: ไฟล์
schema.sql
จะมีสคีมาที่สมบูรณ์สำหรับฐานข้อมูลของคุณ แม้ว่าบางตารางหรือคอลัมน์จะถูกสร้างขึ้นนอกการย้าย dbmate ก็ตาม
Dbmate ได้รับการออกแบบมาเพื่อใช้เป็น CLI กับภาษาหรือเฟรมเวิร์กใดๆ แต่ยังสามารถใช้เป็นไลบรารีในแอปพลิเคชัน Go ได้ด้วย
นี่คือตัวอย่างง่ายๆ อย่าลืมนำเข้าไดรเวอร์ที่คุณต้องการ!
package main
import (
"net/url"
"github.com/amacneil/dbmate/v2/pkg/dbmate"
_ "github.com/amacneil/dbmate/v2/pkg/driver/sqlite"
)
func main () {
u , _ := url . Parse ( "sqlite:foo.sqlite3" )
db := dbmate . New ( u )
err := db . CreateAndMigrate ()
if err != nil {
panic ( err )
}
}
ดูเอกสารอ้างอิงสำหรับตัวเลือกเพิ่มเติม
การย้ายข้อมูลสามารถฝังลงในไบนารีของแอปพลิเคชันของคุณได้โดยใช้ฟังก์ชันฝังของ Go
ใช้ db.FS
เพื่อระบุระบบไฟล์ที่ใช้สำหรับการอ่านการโยกย้าย:
package main
import (
"embed"
"fmt"
"net/url"
"github.com/amacneil/dbmate/v2/pkg/dbmate"
_ "github.com/amacneil/dbmate/v2/pkg/driver/sqlite"
)
//go:embed db/migrations/*.sql
var fs embed. FS
func main () {
u , _ := url . Parse ( "sqlite:foo.sqlite3" )
db := dbmate . New ( u )
db . FS = fs
fmt . Println ( "Migrations:" )
migrations , err := db . FindMigrations ()
if err != nil {
panic ( err )
}
for _ , m := range migrations {
fmt . Println ( m . Version , m . FilePath )
}
fmt . Println ( " n Applying..." )
err = db . CreateAndMigrate ()
if err != nil {
panic ( err )
}
}
ไฟล์การย้ายข้อมูลทำได้ง่ายมาก และจะจัดเก็บไว้ใน ./db/migrations
migrations ตามค่าเริ่มต้น คุณสามารถสร้างไฟล์การโยกย้ายใหม่ชื่อ [date]_create_users.sql
ได้โดยการรัน dbmate new create_users
นี่คือตัวอย่าง:
-- migrate:up
create table users (
id integer ,
name varchar ( 255 ),
);
-- migrate:down
drop table if exists users;
การโยกย้ายทั้งขึ้นและลงจะถูกจัดเก็บไว้ในไฟล์เดียวกัน เพื่อความสะดวกในการแก้ไข จำเป็นต้องมีทั้งคำสั่งขึ้นและลง แม้ว่าคุณจะเลือกที่จะไม่ใช้การย้ายข้อมูลลงก็ตาม
เมื่อคุณใช้การย้าย dbmate จะจัดเก็บเฉพาะหมายเลขเวอร์ชันเท่านั้น ไม่ใช่เนื้อหา ดังนั้นคุณควรย้อนกลับการย้ายก่อนที่จะแก้ไขเนื้อหา ด้วยเหตุนี้ คุณจึงสามารถเปลี่ยนชื่อไฟล์การย้ายข้อมูลได้อย่างปลอดภัยโดยไม่กระทบต่อสถานะที่ใช้ ตราบใดที่คุณคงหมายเลขเวอร์ชันไว้ครบถ้วน
ไฟล์สคีมาถูกเขียนเป็น ./db/schema.sql
ตามค่าเริ่มต้น เป็นดัมพ์ที่สมบูรณ์ของสคีมาฐานข้อมูลของคุณ รวมถึงการย้ายข้อมูลที่ใช้ และการแก้ไขอื่นๆ ที่คุณทำ
ควรเช็คอินไฟล์นี้ในการควบคุมแหล่งที่มา เพื่อให้คุณสามารถเปรียบเทียบความแตกต่างของการย้ายข้อมูลได้อย่างง่ายดาย คุณสามารถใช้ไฟล์สคีมาเพื่อกู้คืนฐานข้อมูลได้อย่างรวดเร็วโดยไม่จำเป็นต้องดำเนินการย้ายข้อมูลทั้งหมด
Dbmate จัดเก็บบันทึกของการโยกย้ายที่ใช้แต่ละครั้งในตารางชื่อ schema_migrations
ตารางนี้จะถูกสร้างขึ้นสำหรับคุณโดยอัตโนมัติหากไม่มีอยู่แล้ว
ตารางนั้นง่ายมาก:
CREATE TABLE IF NOT EXISTS schema_migrations (
version VARCHAR ( 255 ) PRIMARY KEY
)
คุณสามารถปรับแต่งชื่อของตารางนี้ได้โดยใช้แฟล็ก --migrations-table
หรือตัวแปรสภาพแวดล้อม DBMATE_MIGRATIONS_TABLE
เหตุใดจึงมีเครื่องมือการย้ายสคีมาฐานข้อมูลอื่น Dbmate ได้รับแรงบันดาลใจจากเครื่องมืออื่นๆ มากมาย โดยหลักแล้ว Active Record Migrations โดยมีเป้าหมายที่การกำหนดค่าเล็กน้อย และไม่ขึ้นอยู่กับภาษาและเฟรมเวิร์ก นี่คือการเปรียบเทียบระหว่าง dbmate และเครื่องมือการย้ายข้อมูลยอดนิยมอื่น ๆ
ดีบีเมท | ห่าน | sql-โยกย้าย | golang-โยกย้าย | บันทึกที่ใช้งานอยู่ | ภาคต่อ | ทางเดินบิน | สวิทช์ | |
---|---|---|---|---|---|---|---|---|
คุณสมบัติ | ||||||||
ไฟล์การโยกย้าย SQL ธรรมดา | ||||||||
รองรับการสร้างและวางฐานข้อมูล | ||||||||
รองรับการบันทึกไฟล์ดัมพ์สคีมา | ||||||||
ไฟล์การย้ายข้อมูลที่มีการประทับเวลา | ||||||||
ตารางการย้ายข้อมูลสคีมาที่กำหนดเอง | ||||||||
ความสามารถในการรอให้ฐานข้อมูลพร้อม | ||||||||
สตริงการเชื่อมต่อฐานข้อมูลที่โหลดจากตัวแปรสภาพแวดล้อม | ||||||||
โหลดไฟล์ .env โดยอัตโนมัติ | ||||||||
ไม่มีไฟล์การกำหนดค่าแยกต่างหาก | ||||||||
ภาษา/กรอบการทำงานเป็นอิสระ | ||||||||
ไดรเวอร์ | ||||||||
PostgreSQL | ||||||||
MySQL | ||||||||
SQLite | ||||||||
ClсkHouse |
หากคุณสังเกตเห็นความไม่ถูกต้องในตารางนี้ โปรดเสนอการเปลี่ยนแปลง
Dbmate เขียนด้วยภาษา Go ยินดีต้อนรับการดึงคำขอ
การทดสอบจะดำเนินการกับฐานข้อมูลจริงโดยใช้นักเทียบท่าเขียน หากต้องการสร้างอิมเมจนักเทียบท่าและรันการทดสอบ:
$ make docker-all
ในการเริ่มต้นเชลล์การพัฒนา:
$ make docker-sh