نحوه تنظیم یک DEV DB برای توسعه Symfony که در آن از اسکریپت های مهاجرت استفاده نمی شود.

در کار من یک برنامه Symfony ایجاد می کنم. طبق معمول ، اسکریپت های مهاجرت متروکه هستند و من هیچ راهی آسان برای ایجاد یک پایگاه داده MySQL توسعه در دستگاه خود برای توسعه محلی ندارم.
اما من یک راه حل آسان برای تنظیم DB Shema پیدا کردم.
مرحله 1 یک پایگاه داده DB Dump – Initialise را وارد کنید
در مرحله اول ، شما باید یک db توسعه را بدست آورید و با استفاده از MySQL آن را وارد کنید. این کار باید هر بار که یک نمونه DB تازه ایجاد می کنید اجرا شود:
mysql -h 127.0.0.1 -u dbusr -pXXXX somedb < dump.sql
هر بار که DB را رها و بازآفرینی می کنید ، زباله را وارد کنید ، ایده خوبی است که آن را بر روی دیسک سخت خود نگه دارید.
مرحله 2 طرحواره
سپس من از Symfony استفاده می کنم shema:update
و من آن را پس از پردازش (می تواند برخی از SQL ناخواسته ایجاد کند):
php bin/console doctrine:schema:update --dump-sql | \
awk '/^ALTER TABLE/ {
gsub(/,$/, "", $0);
table=$3;
sub(/^ALTER TABLE [^ ]+ /, "", $0);
n=split($0, parts, /, */);
for (i=1; i<=n; i++) {
print "ALTER TABLE " table " " parts[i] ";"
}
next
}
{ print }
' | \
tee /dev/tty | mysql -h 127.0.0.1 -u dbusr -pXXXX somedb
بگذارید این هیولایی را که در بالا تایپ کردم توضیح دهم:
1 به روزرسانی طرحواره SQL
php bin/console doctrine:schema:update --dump-sql
با این دستور SQL را از doctrine:schema:update
با استفاده از پارامتر --dump-sql
2 SQL پس از پردازش با استفاده از AWK
awk '/^ALTER TABLE/ {
gsub(/,$/, "", $0);
table=$3;
sub(/^ALTER TABLE [^ ]+ /, "", $0);
n=split($0, parts, /, */);
for (i=1; i<=n; i++) {
print "ALTER TABLE " table " " parts[i] ";"
}
next
}
با استفاده از AWK من تقسیم می کنم ALTER TABLE
بیانیه SQL به موارد کوچکتر. من از AWK استفاده می کنم زیرا اگر ALTER TABLE
بیانیه چندین رنگ را تغییر می دهد که ممکن است شکست بخورد.
من هرکدام را می خواستم ALTER TABLE
جمله ای برای افزودن ، تغییر یا رها کردن فقط یک ستون در یک زمان ، افزایش تغییرات به روزرسانی ها برای موفقیت در DB.
این به من اجازه می دهد تا در زمان خودم هرگونه مشکل را برطرف کنم.
3 چاپ روی کنسول
tee /dev/tty
با این کار ، من می خواستم نشان دهم که اظهارات SQL بر روی DB اجرا می شود ، در حالی که من آن را به دستور MySQL نیز منتقل می کنم:
4 بیانیه SQL را اجرا کنید
mysql --force -h 127.0.0.1 -u dbusr -pXXXX somedb
سرانجام ، با استفاده از MySQL ، بیانیه هایی را که بر روی DB ایجاد می شود اجرا می کنم. من استفاده می کنم --force
گزینه زیرا اگر ommited و یک بیانیه SQL با شکست مواجه شود ، دیگر بر روی DB اجرا نمی شود.
آنچه من می خواستم این بود که هر جمله SQL را که طرح DB را به روز کرد ، اجرا کنم.
احتیاط
این روش زیر استفاده از اسکریپت های مهاجرت DB است. اما بسیاری از موارد که به دلایل مختلف مهاجرت DB به درستی حفظ نمی شود (کمبود وقت یا دانش) این بهترین چیز بعدی است.
اگر از مهاجرت های DB تیم خود به درستی استفاده می شود ، باید از این روش جلوگیری شود و از اسکریپت های مهاجرت برای تنظیم DB استفاده کنید.
همچنین این روش هر جمله SQL را مجبور می کند بدون هیچ نوع کنترل یا آزمایش بر روی DB اجرا شود. برخی از آنها می توانند خطرناک باشند که آسیب های برگشت ناپذیر به طرح DB انجام دهند. علاوه بر این ، یک تنظیم DB یا مهاجرت نیز نیاز به مهاجرت داده ها نیز دارد که این روش ارائه نمی دهد.
این روش برای a توصیه می شود تنظیم DB محلی در حین توسعه و باید باشد اجتناب شده برای استقرار برنامه
چیزهای خوب در مورد این روش
این روش اگرچه مراحل ثابت را برای تنظیم و به روزرسانی یک پایگاه داده توسعه در هر لحظه ارائه می دهد. من شخصاً 2 اسکریپت bash درست کردم:
موردی که از یک زباله db (همانطور که در مرحله 1 ذکر شد) یک db تازه ایجاد می کند و ایجاد می کند:
#!/usr/bin/env bash
mysql -h 127.0.0.1 -u dbusr -pXXXX -e "DROP DATABASE app_db"
mysql -h 127.0.0.1 -u dbusr -pXXXX somedb -e "CREATE DATABASE app_db"
# Init
mysql -h 127.0.0.1 -u dbusr -pXXXX somedb < dump.sql
و یکی که طرح را به روز می کند (همانطور که در مرحله 2 ذکر شد)
#!/usr/bin/env bash
php bin/console doctrine:schema:update --dump-sql | \
awk '/^ALTER TABLE/ {
gsub(/,$/, "", $0);
table=$3;
sub(/^ALTER TABLE [^ ]+ /, "", $0);
n=split($0, parts, /, */);
for (i=1; i<=n; i++) {
print "ALTER TABLE " table " " parts[i] ";"
}
next
}
{ print }
' | \
tee /dev/tty | mysql -h 127.0.0.1 -u dbusr -pXXXX somedb
این موارد را می توان به عنوان مثال تنظیم کرد اگر برنامه PHP از طریق یک ظرف Docker به نام اجرا شود php
:
#!/usr/bin/env bash
docker exec -u www-data php php bin/console doctrine:schema:update --dump-sql | \
awk '/^ALTER TABLE/ {
gsub(/,$/, "", $0);
table=$3;
sub(/^ALTER TABLE [^ ]+ /, "", $0);
n=split($0, parts, /, */);
for (i=1; i<=n; i++) {
print "ALTER TABLE " table " " parts[i] ";"
}
next
}
{ print }
' | \
tee /dev/tty | mysql -h 127.0.0.1 -u dbusr -pXXXX somedb
امیدوارم این مورد مفید باشد.