Yaşamak için geliştirme veritabanı değişiklikleri göç

10 Cevap php

Belki de yaşamak için yeni işlevsellik iten en büyük risk, yeni kodu gerekli veritabanı değişiklikleri ile yatıyor. Rails, ben onlar programlı geliştirme ana değişiklik yapmak ve daha sonra aynı değişiklikler revize şemayı kullanır kodu ile birlikte yaşamak yapabilirsiniz hangi 'göçler' olduğuna inanıyorum. Ihtiyacı olması halinde ve senkronize bir şekilde geri hem rulo.

Herkes PHP / MySQL için benzer bir araç seti geldi? Bu daha az riskli hale getirmek için ona, ya da herhangi bir program veya işlem çözümleri duymak isterim ...

10 Cevap

Ben programatik göçler güvenmiyorum. Böyle null bir sütun ekleme gibi basit bir değişiklik, eğer, ben sadece canlı sunucuya doğrudan ekleyeceğiz. Daha karmaşık ve veri değişiklikleri gerektiriyorsa, SQL göç dosyaların bir çift yazmak ve kopya veritabanına karşı test edeceğiz.

Göçler kullanırken, always geri alma göç test edin. Bu "oh shit" düğmesine acildir.

Ben iş yapacağını bir araç rastlamak hiç. Onları çalıştırmak için hangi sipariş biliyorum ki onun yerine ben numaralı tek tek dosyaları, kullandım: Raylar göçler aslında, bir manuel versiyonu, ama geri almadan.

İşte bahsediyorum şey çeşit bulunuyor:

000-clean.sql         # wipe out everything in the DB
001-schema.sql        # create the initial DB objects
002-fk.sql            # apply referential integrity (simple if kept separate)
003-reference-pop.sql # populate reference data
004-release-pop.sql   # populate release data
005-add-new-table.sql # modification
006-rename-table.sql  # another modification...

Aslında bunu yaparken herhangi bir sorun haline çalıştırmak hiç, ama çok zarif değil. Bu komut belirli bir güncelleme (akıllı bir numaralandırma düzeni yardımcı olabilir) için çalıştırmak gerekir hangi izlemek size kalmış. Ayrıca kaynak denetimi ile çalışıyor.

Üretim veritabanı muhtemel gelişme DB farklı değerlere sahip olacaktır beri (numaralandırma sütunlarından) yedek anahtar değerleri ile uğraşırken, bir ağrı olabilir. Yani, mümkünse eğer benim modifikasyon komut herhangi bir değişmez vekil anahtar değerini referans asla çalışın.

Ben daha önce bu aracı kullandım ve mükemmel çalıştı.

http://www.mysqldiff.org/

Bu bir giriş, bir DB bağlantı veya bir SQL dosyası olarak ya alır, ve (başka bir DB bağlantı veya başka bir SQL dosyası da) aynı karşılaştırır. Bu değişiklikleri yapmak veya sizin için değişiklik yapmak için SQL tükürmek.

@ [Yukondude]

Perl kendimi kullanıyorum, ve ben aynı şekilde yarı-manuel Rayları tarzı göçlere yol aşağı gitti ettik.

Ne yaptım geçerli şema sürümü bir dizi tek bir satır içeren, bir tek sütun "versiyonu" ile tek bir tablo "sürüm" var idi. Sonra, bu sayıyı okumak belli bir dizinde bakmak ve oradan buraya almak (ve ardından numarayı güncellenmesi) tüm numaralandırılmış geçişleri uygulamak için bir komut dosyası yazmak için (oldukça) önemsiz oldu.

Benim dev / sahne ortamında sık sık (başka bir komut dosyası üzerinden) evreleme veritabanına üretim verileri çekme ve göç komut dosyasını çalıştırın. Canlı gitmeden önce bu yaparsanız göçler çalışacaktır oldukça emin olacağım. Açıkçası sizin hazırlık ortamında kapsamlı test edin.

Ben yeni bir kod ve bir sürüm kontrolü etiketi altında gerekli göçler etiketi. Seni sahne veya yaşamak dağıtmak için sadece bu etikete her şeyi güncellemek ve göç komut dosyası oldukça hızlı çalışır. (Bu gerçekten tuhaf şema değişiklikleri eğer bir kısa kesintiler düzenlenmiş isteyebilirsiniz.)

Symfony temel göçler kolları sfMigrationsLight adında bir eklenti vardır. CakePHP de göçler vardır.

Sebebi ne olursa olsun, göç destek gerçekten orada PHP çerçeveler ve ORMs çoğu için yüksek öncelikli olmamıştı.

Ben (aslında bir arkadaşım tarafından geliştirilen) kullanmak çözüm yukondude başka bir ektir.

  1. 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.
  2. Bir tamsayı sütun adında bir sürümü ile "db_schema" adında bir veritabanı tablo oluşturun.
  3. Ş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.

I SQLyog yapısını kopyalamak için kullanabileceğiniz, ve ben her zaman, beni önce bir yedeğini DAİMA tekrarlayalım.

Hemen hemen Lot105 tarif ne.

Her geçiş bir uygulamak ve geri alma komut ihtiyacı ve göç (ler) uygulanması gereken hangi denetler ve uygun sırayla uygular kontrol komut çeşit var.

Her geliştirici sonra bu programı kullanarak senkronize kendi db tutar ve üretim uygulandığında ilgili değişiklikler uygulanır. Geri alma komut gerekli olduğu takdirde bir değişiklik dışında geri tutulabilir.

Sqldiff üreteceği gibi bazı değişiklikler bu tür bir aracı olarak basit bir ALTER komut ile yapılamaz; bazı değişiklikler bir şema değişikliği ancak varolan veri programlı bir değişiklik gerekmez. Yani gerçekten bir insan düzenlenmiş komut dosyası gerekir neden olan, genelleme olamaz.

Ben her zaman canlı bir site olarak aynı DB benim kalkınma site işaret tutmayı tercih ettik. Bu ilk bakışta riskli gelebilir ama gerçekte pek çok sorun çözer. Eğer aynı DB işaret aynı sunucuda iki siteler varsa, bir gerçek zamanlı ve canlı gittiğinde kullanıcıların göreceksiniz ne doğru görünümü olsun.

Sen sadece 1 veritabanına sahip olacak ve böylece uzun bir tablodan bir sütun silmek asla bir politika yapmak gibi, size yeni kod kullandığınız veritabanı ile maç olacak biliyorum.

Göç önemli ölçüde daha az zarar de bulunmaktadır. Sadece PHP üzerinde hareket etmek gerekir ve zaten aynı DB kullanılarak test edilir.

Ben de kullanıcı yüklenenler için bir hedef herhangi bir klasöre sembolik bağ oluşturmak eğilimindedir. Bu kullanıcı dosyaları güncelleştirilmiş edildiği üzerinde herhangi bir karışıklık var demektir.

Başka bir yan etkiler günlük kullanımda siteyi kullanmak için 'beta-test' küçük bir grup üzerinde geliştirmenin seçenektir. Bu before kamu fırlatma uygulayabilirsiniz geribildirim bir sürü neden olabilir.

Bu her durumda işe olmayabilir ama ben başladım bu model için tüm güncelleştirmeleri hareket ettik. Bu çok düzgün gelişimini ve lansmanları sebep oldu.

Geçmişte kullanmış LiquiBase, XML dosyaları olarak göçler yapılandırın bir Java tabanlı bir araç. Onunla gerekli SQL üretebilirsiniz.

Bugün ben Ruby migration facilities benzer olan Doctrine 2 kitaplığı kullanmak istiyorum.

Kendi komut satırı aracı, mevcut şemayı analiz ve değişen şema tanımları veritabanı eşleştirmek için SQL üretebilir - Symfony 2 çerçeve ayrıca şema değişiklikleri ile başa çıkmak için güzel bir yol var.