PostgreSQL: เครื่องมือ schema diff / patch [ปิด]


14

พิจารณาการตั้งค่าต่อไปนี้:

  • ฐานข้อมูลการผลิต
  • dev db ซึ่งมีการเปลี่ยนแปลงสกีมาเพื่อเปิดใช้งานคุณลักษณะใหม่

เมื่อการพัฒนาคุณลักษณะใหม่เสร็จสมบูรณ์ฉันต้องอัพเดต prod db schema ด้วยตนเองจนกว่าpg_dump --schema-onlyทั้งคู่จะเหมือนกัน กระบวนการนี้เกิดข้อผิดพลาดได้ง่ายและน่าเบื่อ

ดังนั้นฉันกำลังมองหาเครื่องมือที่สามารถ:

  • แสดงสรุปความแตกต่างระหว่างสอง schema (เช่นdiff) โปรดทราบว่าฉันไม่ได้มองหาส่วนต่างของต้นฉบับเพียงอย่างเดียว แต่เป็นเครื่องมือที่ซับซ้อนยิ่งขึ้นซึ่งสามารถสรุปได้เช่น "ตารางXมีคอลัมน์ใหม่Y"
  • สร้างรหัส SQL ที่จะแปลงหนึ่งสกีมาเป็นอีกแบบอัตโนมัติ (เช่นpatch)

มี schema diff / patch tool ที่สามารถช่วยฉันแปลง prod schemas เป็น schemas dev ขั้นสูงหรือไม่


2
คุณควรจัดการสคริปต์การย้ายข้อมูลของคุณด้วยวิธีการควบคุม ไม่ต้องทำการเปลี่ยนแปลง DDL แบบ ad-hoc เป็น DBMS เสมอใส่การเปลี่ยนแปลงลงในสคริปต์ (ซึ่งเก็บไว้ในระบบควบคุมเวอร์ชัน) จากนั้นใช้สคริปต์ ดูเครื่องมือเช่น Liquibase หรือ Flyway
a_horse_with_no_name

1
@a_horse_with_no_name ขอบคุณ แม้จะใช้วิธีนี้เครื่องมือ diff / patch จะทำให้ชีวิตของฉันง่ายขึ้น BTW ฉันไม่สามารถช่วยฮัมเพลง
Adam Matan

คุณอาจลอง pg_comparator: pgfoundry.org/projects/pg-comparator (ฉันไม่เคยใช้มันเลย) Liquibase มีความแตกต่างในตัวเช่นกันและปล่อยผลลัพธ์ออกมาเป็นชุดการเปลี่ยนแปลง Liquibase ถ้าฉันไม่เข้าใจผิดว่าเป็นจุดเริ่มต้นที่ดีสำหรับการจัดการสคีมาที่ควบคุมได้มากขึ้น
a_horse_with_no_name

ขอบคุณ สนใจโพสต์เป็นคำตอบเพื่อให้ฉันสามารถ upvote?
Adam Matan

คำตอบ:


11

ขออภัยที่จะตอบคำถามเก่าอีกครั้ง

เร็ว ๆ นี้ผมได้ใช้0xDBE DataGripเครื่องมือการจัดการฐานข้อมูลโดย JetBrains

มันรองรับเอนจิ้นฐานข้อมูลหลายตัวใน Jetbrains IDE ที่ยอดเยี่ยมและคุณสมบัติสำคัญที่ฉันพบว่ามีประโยชน์คือความสามารถในการdiff2 ตาราง (DEV และ PROD)

ด้านล่างเป็นภาพหน้าจอของการกระทำที่แตกต่างกัน (ในกรณีนี้มีความแตกต่างของคอลัมน์เดียวเท่านั้น) ภาพหน้าจอเป็นผลมาจากปุ่ม "ผสานขวา" ที่ด้านบนสร้าง SQL ที่ต้องการเพื่อนำตารางด้านขวามาขึ้นต้น

0xDBE SQL Table Diff

หวังว่าเครื่องมือใหม่นี้จะช่วยได้


3
ไม่มีปัญหากับการรื้อฟื้นคำถามเก่า ๆ (มีป้ายให้ทำตามนั้น) และคำถาม: เป็นไปได้ไหมที่จะเปรียบเทียบฐานข้อมูลทั้งหมด (อย่างน้อยฉันก็หมายความว่าทุกตารางในนั้น)?
dezso

@dezso - ขอบคุณสำหรับความมั่นใจ ใช่คุณสามารถเปรียบเทียบได้ที่ฐานข้อมูลสคีมาและระดับตาราง
Ewan

1
@BasilBourque - จากเมนูด้านซ้ายDatabaseเลือก 2 ตารางที่คุณต้องการเปรียบเทียบ (กับcmd/ctrl + click) คลิกขวาและเลือกCompare
Ewan

3
ฉันได้มาเมื่อเร็ว ๆ นี้ทั่วเครื่องมือใหม่ที่เขียนในหลามMIGRA มันสามารถติดตามการเปลี่ยนแปลงการเปลี่ยนแปลงตารางมุมมองฟังก์ชั่นดัชนีข้อ จำกัด enums ลำดับและส่วนขยายที่ติดตั้งและยังสามารถใช้เป็นห้องสมุด
สคริปต์

1
@Ewan นอกจากนี้ migra ยังติดตามทุกอย่างในฐานข้อมูลรวมถึงทริกเกอร์และฟังก์ชั่น แต่ DataGrip ไม่ได้ นั่นเป็นเหตุผลที่ฉันไม่แนะนำให้ใช้ DataGrip เป็นเครื่องมือ diff ข้อเสียคือปัจจุบัน: 1) migra เป็นเพียงเครื่องมือ PostgreSQL; 2) migra ติดตามการเปลี่ยนแปลง แต่ไม่ได้สร้างตัวดำเนินการ DDL ที่เหมาะสมเสมอเช่นเปลี่ยนตาราง ... เพิ่มคอลัมน์วางคอลัมน์แทนเปลี่ยนตาราง ... เปลี่ยนชื่อคอลัมน์ ฯลฯ และฉันไม่พบเครื่องมือใด ๆ คำสั่ง DDL ที่ถูกต้อง พวกเขาต้องการการขัดเสมอ นอกจากนี้หากไม่มีเครื่องมือย้ายข้อมูลเช่น Liquibase การแก้ไขฐานข้อมูลใด ๆ จะซับซ้อนเกินไป
Exterminator13

6

ใช้liquibase

มันสนับสนุนdiffสร้าง db ตั้งแต่เริ่มต้น, การปรับปรุง db, ย้อนกลับ db และกลุ่มอื่น ๆ

คุณเคยต้องเขียนทุกอย่างใน XML ด้วย liquibase แต่ไม่ใช่อีกต่อไป คุณสามารถเขียนได้ 99% ในภาษาของ SQL ที่คุณเลือก ตัวอย่าง:

--liquibase formatted sql

--changeset neil:1 

create table contacts(
  contact_id serial primary key,
  name text not null unique
);

--changeset neil:2
alter table contacts add column phone_num text;

คุณควรเก็บรายการเปลี่ยนแปลง liquibase ของคุณในคอมไพล์หรืออะไรก็ได้ที่คุณมี


ปัญหานี้คือมันไม่ได้รับการสั่งซื้อหรือลบข้อ จำกัด และคีย์หลักที่ถูกต้อง
พระสงฆ์

2
Flywayเป็นอีกทางเลือกที่คล้ายกับ Liquibase
Basil Bourque
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.