2010-11-12 9 views
11

Tôi đang làm việc với một dự án hệ điều hành sử dụng miền Nam để di chuyển cơ sở dữ liệu. Tôi đang xây dựng cơ sở dữ liệu mới từ đầu và tôi muốn đảm bảo rằng miền Nam được thiết lập để tôi có thể dễ dàng cập nhật cơ sở dữ liệu trong tương lai.Làm cách nào để tạo cơ sở dữ liệu mới cho Ứng dụng hiện có bằng cách sử dụng Django South và đặt giá trị mặc định?

Dường như quá trình này sẽ là:

  1. tạo db
  2. syncdb
  3. di chuyển

Tuy nhiên, khi tôi cố gắng để di chuyển các cơ sở dữ liệu, một trong những cuộc di cư trước đó (di chuyển 0004 và họ đi đến 0009) ném ngoại lệ:

ValueError: You cannot add a null=False column without a default value. 

Tôi không hiểu cách thêm giá trị mặc định vào di chuyển 0004 để ngoại lệ này không được ném.

Việc di chuyển không cần phải chạy qua vì cơ sở dữ liệu trống.

Tuy nhiên, south_migrationhistory phải chứa danh sách tất cả các lần di chuyển và khi chúng được áp dụng.

Tôi đã cố gắng để hack nó và chỉ cần thêm di chuyển 0009 vào cơ sở dữ liệu bằng tay, nhưng điều này đã ném một lỗi khác vì di chuyển trung gian đã không được chạy. Tôi cũng đã cố gắng thêm một trường vào cơ sở dữ liệu để xem liệu tôi có thể tìm ra cú pháp của add_column giống như với giá trị mặc định là 0 được cung cấp hay không. Định dạng trông hoàn toàn khác với các di chuyển cũ hơn này.

Sau đây là 2 phiên bản khác nhau của cú pháp add_column:

#0004 syntax: 
db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size']) 
#0009 syntax: 
syntax db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False) 

Vì vậy, tôi đoán là có một sự thay đổi trong mã Nam từ khi 0004 được tạo ra và ngày hôm nay.

Có cách nào để xây dựng cơ sở dữ liệu bằng syncdb và sau đó bằng cách nào đó cập nhật south_migrationhistory mà không chạy manage.py di chuyển?

Nếu bạn có ứng dụng hiện có với di chuyển ở miền Nam, bạn sẽ xây dựng cơ sở dữ liệu mới từ đầu như thế nào?

Tôi không thể di chuyển vì không có thiết lập mặc định trên trường số nguyên. Làm cách nào để đặt mặc định trong di chuyển cũ hơn? Các lĩnh vực thậm chí không tồn tại nữa.

cú pháp đã cố gắng:

db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'], {'default': 0}) 
#throws ValueError: You cannot add a null=False column without a default value. 
db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False) 
#throws AttributeError: Migration instance has no attribute 'gf' 

Tôi đang sử dụng Nam-0.7.2-py2.7.trứng

Trả lời

16

Andrew Godwin cung cấp một câu trả lời:

Có, sử dụng:

./manage.py syncdb --all 

thì:

./manage.py migrate --fake 

di chúc này, tuy nhiên, cũng bỏ qua bất kỳ di cư có thể thêm vào dữ liệu vào cơ sở dữ liệu.