برنامه نویسی

نحوه تنظیم یک 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 
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

امیدوارم این مورد مفید باشد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا