Hedef veritabanı güncel değil


101

Bir Flask uygulaması için geçiş yapmak istiyorum. Alembic kullanıyorum.

Ancak aşağıdaki hatayı alıyorum.

Target database is not up to date.

İnternette bununla bir ilgisi olduğunu okudum. http://alembic.zzzcomputing.com/en/latest/cookbook.html#building-an-up-to-date-database-from-scratch

Maalesef veritabanını nasıl güncelleyeceğimi ve linkte verilen kodu nereye / nasıl yazmam gerektiğini tam olarak anlayamıyorum. Göç konusunda tecrübeniz varsa, lütfen bunu benim için açıklar mısınız

Teşekkürler

Yanıtlar:


104

Bir geçiş oluşturduktan sonra, manuel olarak veya farklı bir şekilde --autogenerateuygulamanız gerekir alembic upgrade head. Eğer kullanılırsa db.create_all()bir kabuk, kullanabileceğiniz alembic stamp headveritabanı mevcut durumu tüm göçler uygulanmasını temsil ettiğini gösterir.


65

Bu Benim İçin Çalıştı

$ flask db stamp head
$ flask db migrate
$ flask db upgrade

38

Benim durumum şu soruya benzer: "./manage.py db migrate -m 'İlişki ekle" yi çalıştırdığımda, "alembic.util.exc.CommandError: Hedef veritabanı güncel değil."

Bu yüzden taşıma işlemimin durumunu kontrol ettim:

(venv) ]#./manage.py db heads
d996b44eca57 (head)
(venv) ]#./manage.py db current
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
715f79abbd75

ve kafaların ve akımın farklı olduğunu gördüler!

Şu adımları uygulayarak düzelttim:

(venv)]#./manage.py db stamp heads
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running stamp_revision 715f79abbd75 -> d996b44eca57

Ve şimdi akım baş için aynı

(venv) ]#./manage.py db current
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
d996b44eca57 (head)

Ve şimdi geçişi tekrar yapabilirim.


Tıkır tıkır çalışıyor ! Bu sorunu yönetmenin en iyi yolunun bu olduğunu düşünüyorum!
attaboyabhipro

Burada aynı! Sorunsuz çalıştı. Bunun db kafaları ve akımla ilgisi olduğunu biliyordum, ancak "damga" komutu olduğunu bilmiyordum. Teşekkürler!
Subspacian

10

Bu, birçok yoldan çözülebilir:

1 Bu hatayı düzeltmek için, en son geçiş dosyasını (bir python dosyası) silin ve ardından yeniden bir geçiş gerçekleştirmeyi deneyin.

Sorun devam ederse şu komutları deneyin:

$ flask db stamp head  # To set the revision in the database to the head, without performing any migrations. You can change head to the required change you want.
$ flask db migrate     # To detect automatically all the changes.
$ flask db upgrade     # To apply all the changes.

8

Bazı nedenlerden dolayı geçiş dosyalarımdan bazılarını silmem gerekti. Emin değilim neden. Ama bu sorunu çözdü, bir nevi.

Bir sorun, veritabanının tüm yeni tablolar vb. İle düzgün bir şekilde güncellenmesi, ancak otomatikleştirmeyi kullandığımda geçiş dosyalarının kendisinde herhangi bir değişiklik göstermemesidir.

Birisinin daha iyi bir çözümü varsa, lütfen bana bildirin, çünkü şu anda benim çözümüm biraz karmaşık.


Şimdi biraz eski olduğunu biliyorum ama tablolarınız Base'den mi miras kalıyor? Aynı sorunu yaşadım ve yeni tablolarımın üssün olduğu Base = declarative_base() ve aynı zamanda hatırladığım from sqlalchemy.ext.declarative import declarative_base

7
$ flask db stamp head  # To set the revision in the database to the head, without performing any migrations. You can change head to the required change you want.
$ flask db migrate  # To detect automatically all the changes.
$ flask db upgrade  # To apply all the changes.

Daha fazla bilgiyi https://flask-migrate.readthedocs.io/en/latest/ belgelerinde bulabilirsiniz.


2

Ben de farklı kafalarla karşılaştım ve alanlardan birini dizeden tam sayıya değiştirmek istedim, bu yüzden önce şunu çalıştırın:

$ flask db stamp head # to make the current the same
$ flask db migrate
$ flask db upgrade

Şimdi çözüldü!


1

Bu, benim gibi, yeni bir projeye yeni başladıysanız ve bellek içi SQLite veritabanı ( sqlite:///:memory:) kullanıyorsanız da olabilir. Böyle bir veri tabanına bir geçiş uygularsanız, tabii ki bir dahaki sefere otomatik olarak bir revizyon oluştur demek istediğinizde, veri tabanı yine de orijinal durumunda (boş) olacaktır, bu nedenle alembic, hedef veri tabanının güncel olmadığından şikayet edecektir. tarih. Çözüm, kalıcı bir veritabanına geçmektir.


0

Bu hatayı düzeltmek için, en son geçiş dosyasını (bir python dosyası) silin ve ardından yeniden bir geçiş gerçekleştirmeyi deneyin.


-2

Db yükseltme komutunu çalıştırmadan önce tüm tabloları bırakmayı deneyin.


-6

Bunu çözmek için, geçiş sırasında tabloları bırakıyorum (siliyorum) ve bu komutları çalıştırıyorum

flask db migrate

ve

flask db upgrade
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.