मैं जिस समाधान का उपयोग करता हूं (मूल रूप से मेरे एक दोस्त द्वारा विकसित) युकोंडुड में एक और परिशिष्ट है।
- संस्करण नियंत्रण में एक स्कीमा निर्देशिका बनाने और उसके बाद प्रत्येक को बदलने DB के लिए आप एसक्यूएल आप db_schema तालिका अद्यतन करने के लिए एसक्यूएल क्वेरी के साथ निष्पादित करना चाहते हैं के साथ एक sql फ़ाइल रख सकते हैं।
- संस्करण नामक एक पूर्णांक कॉलम के साथ "db_schema" नामक डेटाबेस तालिका बनाएं।
- स्कीमा निर्देशिका में दो खोल स्क्रिप्ट, "वर्तमान" और "अद्यतन" बनाएं।निष्पादन वर्तमान आपको बताता है कि डीबी स्कीमा का कौन सा संस्करण आप जिस डेटाबेस से कनेक्ट हैं, वह वर्तमान में है। रनिंग अपडेट प्रत्येक .sql फ़ाइल को db_schema तालिका में संस्करण से अधिक क्रमशः निष्पादित करता है जब तक कि आप अपने स्कीमा डीआईआर में सबसे बड़ी संख्या में फ़ाइल तक न हों।
स्कीमा निर्देशिका में फ़ाइलें:
0-init.sql
1-add-name-to-user.sql
2-add-bio.sql
क्या एक विशिष्ट फ़ाइल की तरह दिखता है, हर sql फ़ाइल के अंत में db_schema अद्यतन पर ध्यान दें:
BEGIN;
-- comment about what this is doing
ALTER TABLE user ADD COLUMN bio text NULL;
UPDATE db_schema SET version = 2;
COMMIT;
"वर्तमान" स्क्रिप्ट (psql के लिए):
#!/bin/sh
VERSION=`psql -q -t <<EOF
\set ON_ERROR_STOP on
SELECT version FROM db_schema;
EOF
`
[ $? -eq 0 ] && {
echo $VERSION
exit 0
}
echo 0
अद्यतन स्क्रिप्ट (यह भी psql):
#!/bin/sh
CURRENT=`./current`
LATEST=`ls -vr *.sql |egrep -o "^[0-9]+" |head -n1`
echo current is $CURRENT
echo latest is $LATEST
[[ $CURRENT -gt $LATEST ]] && {
echo That seems to be a problem.
exit 1
}
[[ $CURRENT -eq $LATEST ]] && exit 0
#SCRIPT_SET="-q"
SCRIPT_SET=""
for ((I = $CURRENT + 1 ; I <= $LATEST ; I++)); do
SCRIPT=`ls $I-*.sql |head -n1`
echo "Adding '$SCRIPT'"
SCRIPT_SET="$SCRIPT_SET $SCRIPT"
done
echo "Applying updates..."
echo $SCRIPT_SET
for S in $SCRIPT_SET ; do
psql -v ON_ERROR_STOP=TRUE -f $S || {
echo FAIL
exit 1
}
done
echo OK
मेरे 0-init.sql प्रारंभिक के साथ पूर्ण प्रारंभिक स्कीमा संरचना है "अद्यतन db_schema सेट संस्करण = 0;"। MySQL के लिए इन स्क्रिप्ट को संशोधित करने के लिए बहुत कठिन नहीं होना चाहिए। मेरे मामले में मैं भी
export PGDATABASE="dbname"
export PGUSER="mike"
मेरी .bashrc में
है। और यह प्रत्येक फ़ाइल के साथ पासवर्ड के लिए संकेत देता है जिसे निष्पादित किया जा रहा है।
स्रोत
2010-08-15 18:24:27
आप कॉलम का नाम बदलने का तरीका कैसे प्रबंधित करते हैं? एक त्वरित नाम आपके उत्पादन पर्यावरण को तोड़ देगा, है ना? –
@ केविन पांग - यह सच है लेकिन मैं अक्सर अपने कॉलम का नाम बदलता नहीं हूं। मैंने पाया है कि कम राक्षस कॉलम नामों को जिस तरह से छोड़ना है उसे छोड़ना है। यह मुझे कॉलम नामों के बारे में सावधानी से सोचता है लेकिन मुझे यह भी एक दुर्लभ घटना मिलती है। यदि कोई नाम बदलना चाहिए, तो दो प्रणालियों में एक खोज-प्रतिस्थापन एक सिस्टम से अधिक समय नहीं लेता है। यह अभी भी एक डीबी माइग्रेशन की तुलना में कम डाउनटाइम और उत्तेजना का कारण बनता है। मुझे पता है कि यह अपरंपरागत है, लेकिन यह मेरे लिए बहुत अच्छा काम करता है :) – Paulo