2010-06-22 41 views
184

Tôi đang cố gắng bắt đầu với miền Nam. Tôi đã có cơ sở dữ liệu hiện tại và tôi đã thêm miền Nam (syncdb, schemamigration --initial).Django South - bảng đã tồn tại

Sau đó, tôi đã cập nhật models.py để thêm trường và chạy ./manage.py schemamigration myapp --auto. Nó dường như tìm thấy lĩnh vực và nói rằng tôi có thể áp dụng điều này với ./manage.py migrate myapp. Nhưng, thực hiện điều đó đã cho các lỗi:

django.db.utils.DatabaseError: table "myapp_tablename" already exists 

tablename là bảng đầu tiên được liệt kê trong models.py.

Tôi đang chạy Django 1.2, Hàn 0,7

Trả lời

308

kể từ khi bạn đã có các bảng được tạo ra trong cơ sở dữ liệu, bạn chỉ cần chạy di chuyển ban đầu như giả

./manage.py migrate myapp --fake 

chắc chắn rằng giản đồ của các mô hình giống như lược đồ của các bảng trong cơ sở dữ liệu.

+1

OK, cảm ơn. Nó thực sự di chuyển và không có kế hoạch, nhưng câu trả lời của bạn đã cho tôi đi đúng hướng. – Steve

+1

lỗi của tôi chỉ sao chép lệnh từ OP, lệnh đúng ./manage.py di chuyển myapp --fake – Ashok

+3

Tôi thích tìm câu trả lời quá nhanh - cảm ơn nhiều @Ashok! –

40

Although the table "myapp_tablename" already exists error stop raising after I did ./manage.py migrate myapp --fake, the DatabaseError shows no such column: myapp_mymodel.added_field.

Có cùng một vấn đề!

1.Chỉ cần kiểm tra số di chuyển đang gây ra điều này. Hãy giả định nó là: 0010.

2.You cần phải:

./manage.py schemamigration myapp --add-field MyModel.added_field 
./manage.py migrate myapp 

nếu có nhiều hơn một lĩnh vực còn thiếu, bạn phải lặp lại nó cho từng lĩnh vực.

3.Bạn phải hạ cánh bằng một loạt di chuyển mới để xóa tệp của họ từ myapp/migrations (0011 và hơn nữa nếu bạn cần thêm nhiều trường).

4.Run này:

./manage.py migrate myapp 0010 

Bây giờ thử ./manage.py di chuyển myapp

Nếu nó không thất bại bạn đã sẵn sàng. Chỉ cần kiểm tra lại nếu bất kỳ trường nào không bị thiếu.

EDIT:

Vấn đề này cũng có thể xảy ra khi bạn có một cơ sở dữ liệu sản xuất mà bạn cài đặt miền Nam và là người đầu tiên, di chuyển ban đầu tạo ra dụng trong môi trường khác bản sao những gì bạn đã có trong db của bạn. Giải pháp là dễ dàng hơn nhiều ở đây:

  1. Fake cuộc di cư đầu tiên:

    ./manage di chuyển myapp 0001 --fake

  2. cuộn với phần còn lại của cuộc di cư:

    ./ quản lý di chuyển myapp

10

Khi tôi gặp phải lỗi này, nó có sự khác biệt ent gây ra.

Trong trường hợp của tôi, bằng cách nào đó, Miền Nam đã để lại trong DB của tôi một bảng trống tạm thời, được sử dụng trong _remake_table(). Có lẽ tôi đã hủy bỏ một cuộc di cư theo cách mà tôi không nên có. Trong mọi trường hợp, mỗi lần di chuyển mới tiếp theo, khi nó được gọi là _remake_table(), đã ném lỗi sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists, bởi vì nó đã làm đã tồn tại và không được phép ở đó.

bit _south_new trông kỳ lạ với tôi, vì vậy tôi duyệt qua DB, thấy bảng _south_new_myapp_mymodel, gãi đầu, xem South's source, quyết định là rác, bỏ bảng và tất cả đều tốt.

+0

Đây là những gì tôi nhìn thấy, và tôi đã tìm thấy điều này, đã có thể tiết kiệm cho tôi nửa giờ đau đầu. Khá khó chịu - nhưng đây là các bảng di chuyển tạm thời và được để lại trong quá trình di chuyển không thành công, có thể vì mục đích kiểm tra. Mỏ xảy ra do một số vấn đề toàn vẹn db trong quá trình di chuyển. –

+0

Điều này cần phải cao hơn! Nếu bạn đang sử dụng một giao dịch lược đồ db w/o, điều này có thể xảy ra khá dễ dàng –

2

Perform these steps in order may help you:

1) python manage.py schemamigration apps.appname --initial

Trên bước tạo thư mục di cư như mặc định.

2) python manage.py di chuyển apps.appname --fake

tạo di chuyển giả.

3) python manage.py schemamigration apps.appname --auto

Sau đó, bạn có thể thêm các trường như bạn muốn và thực hiện các lệnh trên.

4) python manage.py di chuyển apps.appname

1

Nếu bạn có một cơ sở dữ liệu hiện có và ứng dụng bạn có thể sử dụng lệnh chuyển đổi nam

./manage.py convert_to_south myapp 

này đã được áp dụng trước bạn làm bất kỳ thay đổi nào đã có trong cơ sở dữ liệu.

Lệnh convert_to_south chỉ hoạt động hoàn toàn trên máy đầu tiên bạn chạy nó. Khi bạn đã cam kết di chuyển ban đầu vào VCS, bạn sẽ phải chạy ./manage.py migrate myapp 0001 --fake trên mọi máy có bản sao của bộ mã (đảm bảo chúng được cập nhật với các mô hình và sơ đồ trước). ref: http://south.readthedocs.org/en/latest/convertinganapp.html

2

Nếu bạn gặp sự cố với mô hình của mình không khớp với cơ sở dữ liệu, như @pielgrzym và bạn muốn tự động di chuyển cơ sở dữ liệu để khớp với tệp models.py mới nhất (và xóa mọi dữ liệu sẽ không tái tạo bởi đồ đạc trong migrate):

manage.py schemamigration myapp --initial 
manage.py migrate myapp --fake 
manage.py migrate myapp zero 
manage.py migrate myapp 

này sẽ chỉ xóa và tạo lại bảng cơ sở dữ liệu mà tồn tại trong tập tin models.py mới nhất của bạn, vì vậy bạn có thể có bảng rác trong cơ sở dữ liệu của bạn từ trước syncdb s hoặc migrate s. Để thoát khỏi đó, trước tất cả những cuộc di cư với:

manage.py sqlclear myapp | manage.py sqlshell 

Và nếu điều đó vẫn còn để một số cruft nằm xung quanh trong cơ sở dữ liệu của bạn thì bạn sẽ phải làm một inspectdb và tạo ra các tập tin models.py từ đó (đối với các bảng và ứng dụng mà bạn muốn xóa) trước khi thực hiện sqlclear và sau đó khôi phục lại models.py gốc của bạn trước khi tạo di chuyển --initial và di chuyển đến nó. Tất cả điều này để tránh rối tung xung quanh với hương vị đặc biệt của SQL mà cơ sở dữ liệu của bạn cần.

0

Là giải pháp tạm thời, bạn có thể nhận xét việc tạo bảng trong tập lệnh di chuyển.

class Migration(migrations.Migration): 

    dependencies = [ 
     (...) 
    ] 

    operations = [ 
     #migrations.CreateModel(
     # name='TABLE', 
     # fields=[ 
     #   .... 
     #   .... 
     # ], 
     #), 
     .... 
     .... 

Hoặc

Nếu bảng hiện có chứa không có hàng (trống), sau đó xem xét xóa bàn như dưới đây. (Bản sửa lỗi này chỉ được khuyến nghị nếu bảng không chứa hàng). Ngoài ra, hãy đảm bảo thao tác này trước thao tác createModel.

class Migration(migrations.Migration): 

    dependencies = [ 
     (...), 
    ] 

    operations = [ 
     migrations.RunSQL("DROP TABLE myapp_tablename;") 
    ] 
0

Một giải pháp khác (có thể là giải pháp tạm thời).

$ python manage.py sqlmigrate APP_NAME MIGRATION_NAME 

ví dụ:.,.

$ python manage.py sqlmigrate users 0029_auto_20170310_1117 

Điều này sẽ liệt kê tất cả các di chuyển trong truy vấn sql thô. Bạn có thể chọn các truy vấn mà bạn muốn chạy tránh phần tạo bảng hiện có

Các vấn đề liên quan