diffium-db: دیدن زندهٔ تغییرات دیتابیس
خلاصهٔ کاملتر
دنیسلاو گاوریلوف تو این پست میگه حالا این ایجنتها هستن که مایگریشنها رو اجرا میکنن، و دردسر از ده دقیقهٔ بعدش شروع میشه. git diff فایل مایگریشن رو نشونت میده، ولی نمیگه اون مایگریشن واقعاً چیکار کرد، و دربارهٔ ردیفی که ایجنت وسط راه آپدیت کرده هیچی نمیگه. به گفتهٔ نویسنده ابزارهای schema diff هم معمولاً بعد از تموم شدن کار روی دو تا دیتابیس اجرا میشن و چیزی کنار دستت باز نمیمونه.
diffium-db همین کمبود رو پر میکنه: یه TUI که با فریمورک ترمینالی OpenTUI و Bun نسخهٔ ۱.۳ به بالا ساخته شده و پشت اون فقط یه وابستگی داره. اول یه بیسلاین از دیتابیس میگیری، بعد واچر رو باز میذاری و هر ثانیه دیتابیس دوباره خونده میشه. سمت چپ لیست هر چیزی که عوض شده و سمت راست حالت قبل و بعد همون آبجکته. چهار دستور داره: watch، snapshot، baselines و diff، و آخری با --exit-code وقتی چیزی تغییر کرده باشه کد ۱ برمیگردونه.
نویسنده تأکید میکنه که این ابزار رو نباید روی پروداکشن نشونه بگیری. کاری که خودش میکنه اینه که به ایجنت یه برنچ Neon میده؛ برنچ copy-on-write هست، پس با همون اسکیما و همون ردیفهای دیتابیس اصلی بالا میاد و ساختن یکیشون حدود ۱.۲ ثانیه طول کشیده. بعد دیف رو میخونی: اگه مایگریشن همونی بود که میخواستی، روی دیتابیس اصلی اجراش میکنی، وگرنه فقط یه کپی رو دور میندازی. هیچجای خود ابزار مخصوص Neon نیست و با هر پستگرسی کار میکنه.
جالبترین بخش، دیف ردیفهاست. برای اینکه بفهمه یه ردیف عوض شده، بهجای نگه داشتن کل داده فقط یه اثر انگشت ذخیره میشه: کلید اصلی، md5(t::text) کل رکورد و یه پیشنمایش کوتاه. کلید جدید یعنی insert، کلید غایب یعنی delete، و کلید یکسان با هش عوضشده یعنی update. ولی اگه جدول یه ستون جدید بگیره، هش همهٔ ردیفها با هم عوض میشه؛ اونوقت ابزار بهجای ~3 مینویسه ~3? و بالای دیف توضیح میده که فقط شمارش update حدسیه، چون insert و delete از کلید اصلی میان و دقیقن.
دیف ساختاری هم روی یه تصمیم ساده سواره: هر آبجکت به یه بلوک متن با ترتیب خط ثابت رندر میشه و دیف فقط یه line diff از همون بلوکهاست. هزینهش اینه که ابزار وضعیت فعلی دیتابیس رو نشون میده، نه دستور DDL که تو رو به اون حالت میرسونه. نسخهٔ v1 هنوز ORM رو نمیشناسه، فقط پستگرس رو پشتیبانی میکنه و بهجای logical replication از polling استفاده میکنه. حدود ۲۲۰۰ خط کد و ۹۰۰ خط تست داره و ۶۴ تا از تستهاش بدون هیچ دیتابیسی اجرا میشن.
نکات کلیدی:
- واچر هر یک ثانیه دیتابیس رو دوباره میخونه و جدول، ویو، ویوی متریالایز، enum و فانکشن رو دنبال میکنه.
- diff --exit-code وقتی چیزی عوض شده باشه کد ۱ میده، پس میشه باهاش یه جاب CI رو فِیل کرد.
- بیسلاینها پیشفرض تو .diffium-db/snapshots/ به شکل JSON ذخیره میشن، یا با --store neon داخل خود پستگرس.
- جدولهای بدون کلید اصلی و جدولهای بزرگتر از --row-limit (پیشفرض ۵۰۰۰ ردیف) فقط تعداد ردیف میگیرن و هیچ ادعایی دربارهٔ تغییرشون نمیشه.
- ابزار هیچوقت روی دیتابیسی که داره تماشاش میکنه چیزی نمینویسه؛ تنها جایی که مینویسه استور خودشه.
- کد با مجوز MIT روی GitHub منتشر شده و به Bun نسخهٔ ۱.۳ یا بالاتر نیاز داره.




