Ben (aslında bir arkadaşım tarafından geliştirilen) kullanmak çözüm yukondude başka bir ektir.
- Sürüm kontrolü altında bir şema dizin oluşturun ve sonra her seni değiştirmek db için size db_schema tablosunu güncelleştirmek için sql sorgusu ile birlikte yürütülen istediğiniz SQL ile bir. Sql dosyası tutmak olun.
- Bir tamsayı sütun adında bir sürümü ile "db_schema" adında bir veritabanı tablo oluşturun.
- Şema dizinde iki kabuk komut, "mevcut" ve "güncelleştirme" yaratmak. Akımı yürütülüyor bağlı olduğunuz veritabanı şu an size db şema hangi sürümünü söyler. Güncelleştirme Koşu Eğer şema dir en büyük numaralı dosyaya kadar oluncaya kadar db_schema tablo sıralı olarak sürümü daha büyük numaralandırılmış her. Sql dosyasını yürütür.
Şema dir Dosyalar:
0-init.sql
1-add-name-to-user.sql
2-add-bio.sql
. Tipik bir dosya gibi göründüğünü, her sonunda db_schema güncellemeyi unutmayın sql dosyası:
BEGIN;
-- comment about what this is doing
ALTER TABLE user ADD COLUMN bio text NULL;
UPDATE db_schema SET version = 2;
COMMIT;
(Psql) "akım" komut:
#!/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
Güncelleştirme komut (ayrıca 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
Benim 0-init.sql başlangıç ile birlikte tam ilk şema yapıya sahiptir "= 0 UPDATE db_schema SET versiyonu;". MySQL için bu komut dosyalarını değiştirmek için çok zor olmamalı. Benim durumumda ben de var
export PGDATABASE="dbname"
export PGUSER="mike"
benim. bashrc içinde. Ve idam edilecek her dosya ile şifre sorar.