Cơ sở dữ liệu mục tiêu không được cập nhật


101

Tôi muốn thực hiện chuyển đổi cho ứng dụng Flask. Tôi đang sử dụng Alembic.

Tuy nhiên, tôi nhận được lỗi sau.

Target database is not up to date.

Trực tuyến, tôi đọc rằng nó có một cái gì đó để làm với điều này. http://alembic.zzzcomputing.com/en/latest/cookbook.html#building-an-up-to-date-database-from-scratch

Thật không may, tôi không hiểu rõ làm thế nào để cập nhật cơ sở dữ liệu và tôi nên viết mã ở đâu / như thế nào trong liên kết. Nếu bạn có kinh nghiệm về việc di chuyển, bạn có thể vui lòng giải thích điều này cho tôi được không

Cảm ơn

Câu trả lời:


104

Sau khi tạo quá trình di chuyển, theo cách thủ công hoặc dưới dạng --autogenerate, bạn phải áp dụng nó với alembic upgrade head. Nếu bạn đã sử dụng db.create_all()từ một trình bao, bạn có thể sử dụng alembic stamp headđể chỉ ra rằng trạng thái hiện tại của cơ sở dữ liệu đại diện cho ứng dụng của tất cả các lần di chuyển.


65

Điều này làm việc cho tôi

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

38

Tình huống của tôi giống như câu hỏi này, Khi tôi thực hiện "./manage.py db migrate -m 'Thêm mối quan hệ'", đã xảy ra lỗi như sau "alembic.util.exc.CommandError: Cơ sở dữ liệu mục tiêu không được cập nhật."

Vì vậy, tôi đã kiểm tra trạng thái di chuyển của mình:

(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

và thấy rằng đầu và dòng điện là khác nhau!

Tôi đã sửa nó bằng cách thực hiện các bước sau:

(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

Và bây giờ dòng điện cũng giống như đầu

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

Và bây giờ tôi có thể thực hiện lại việc di chuyển.


Hoạt động như một sự quyến rũ! Tôi cảm thấy đây là cách tốt nhất để quản lý vấn đề này!
attaboyabhipro

Ở đây cũng vậy! Làm việc trơn tru. Tôi biết nó có liên quan đến đầu db và dòng điện, nhưng không biết có lệnh "đóng dấu". Cảm ơn!
Subspacian

10

Điều này có thể được giải quyết bằng nhiều cách:

1 Để khắc phục lỗi này, hãy xóa tệp di chuyển mới nhất (tệp python), sau đó thử thực hiện lại quá trình di chuyển.

Nếu sự cố vẫn tiếp diễn, hãy thử các lệnh sau:

$ 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

Tôi đã phải xóa một số tệp di chuyển của mình vì một số lý do. Không chắc chắn lý do tại sao. Nhưng điều đó đã khắc phục được vấn đề, đại loại là.

Một vấn đề là cơ sở dữ liệu kết thúc được cập nhật đúng cách, với tất cả các bảng mới, v.v. nhưng bản thân các tệp di chuyển không hiển thị bất kỳ thay đổi nào khi tôi sử dụng tự động hóa.

Nếu ai đó có giải pháp tốt hơn, vui lòng cho tôi biết, vì hiện tại giải pháp của tôi là một loại hacky.


Tôi biết bây giờ nó hơi cũ, nhưng các bảng của bạn có kế thừa từ Base không? Tôi đã cùng một vấn đề và automigrate không được chọn lên thay đổi do thực tế rằng bảng mới của tôi không được kế thừa từ cơ sở nơi cơ sở được Base = declarative_base() và cũng nhớ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.

Bạn có thể tìm thêm thông tin tại tài liệu https://flask-migrate.readthedocs.io/en/latest/


2

Tôi cũng đã gặp phải các phần đầu khác nhau và tôi muốn thay đổi một trong các trường từ chuỗi thành số nguyên, vì vậy trước tiên hãy chạy:

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

Nó đã được giải quyết ngay bây giờ!


1

Điều này cũng có thể xảy ra nếu bạn, giống như tôi, vừa bắt đầu một dự án mới và bạn đang sử dụng cơ sở dữ liệu SQLite trong bộ nhớ ( sqlite:///:memory:). Nếu bạn áp dụng di chuyển trên cơ sở dữ liệu như vậy, rõ ràng lần sau khi bạn muốn nói tự động tạo bản sửa đổi, cơ sở dữ liệu sẽ vẫn ở trạng thái ban đầu (trống), vì vậy alembic sẽ phàn nàn rằng cơ sở dữ liệu đích không đạt ngày. Giải pháp là chuyển sang cơ sở dữ liệu lâu dài.


0

Để khắc phục lỗi này, hãy xóa tệp di chuyển mới nhất (tệp python) sau đó thử thực hiện lại quá trình di chuyển.


-2

Cố gắng loại bỏ tất cả các bảng trước khi thực hiện lệnh nâng cấp db.


-6

Để giải quyết vấn đề này, tôi thả (xóa) các bảng trong quá trình di chuyển và chạy các lệnh này

flask db migrate

flask db upgrade
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.