2010-08-23 43 views
8

Tôi duy trì một dự án Django với một cơ sở dữ liệu có một số ràng buộc mô hình đã không đồng bộ với cơ sở dữ liệu thực tế. Vì vậy, ví dụ, một số trường mô hình có null = False thiết lập, nhưng cơ sở dữ liệu cho phép NULL cho cột cơ sở dữ liệu tương ứng.Django - So sánh mã mẫu với cơ sở dữ liệu

Tôi tò mò nếu có tiện ích, hoặc trong Django hoặc tập lệnh Python của bên thứ ba, sẽ so sánh đầu ra SHOW CREATE TABLE (trong trường hợp này, sử dụng cú pháp MySQL) cho mỗi bảng và so sánh nó với python manage.py sql đầu ra, để làm nổi bật sự khác biệt.

Được cấp, trong tình huống lý tưởng, cơ sở dữ liệu sẽ không đồng bộ với mã mô hình Django ngay từ đầu, nhưng vì đó là nơi tôi đang tò mò, nếu có giải pháp cho vấn đề này trước khi tôi viết một bản thân hoặc làm so sánh thủ công.

+0

tại sao bạn không so sánh chúng với công cụ khác, như công cụ này http://www.quickdiff.com/index.php? –

+0

@ Gabi- đó là những gì tôi đang làm bằng tay. Tôi đã tò mò nếu ai đó đã tạo ra một tiện ích mà tạo ra đầu ra cho mỗi mà tôi có thể dễ dàng khác biệt. Vì nó là ngay bây giờ, mà hoạt động tốt, nhưng đầu ra cho mỗi không xếp hàng, vì vậy tôi phải làm điều đó bảng theo bảng. –

Trả lời

4

./manage.py inspectdb tạo tệp mô hình tương ứng với các mô hình tồn tại trong cơ sở dữ liệu.

Bạn có thể phân biệt nó với các tệp mô hình hiện tại của bạn bằng cách sử dụng khác biệt unix tiêu chuẩn hoặc bất kỳ ưa thích khác diffing tool để tìm sự khác biệt và lập kế hoạch chiến lược di chuyển của bạn.

Mặc dù trước đây dường như đơn giản hơn và tốt hơn, bạn cũng có thể thấy sự khác biệt ở cấp sql. ./manage.py sqlall tạo sql cho lược đồ db hiện tại và tương ứng show create table table-name hiển thị sql để tạo bảng.

Bạn có thể muốn tham chiếu http://code.google.com/p/django-evolution/ khi đã tự động di chuyển trạng thái của db sang trạng thái trong mô hình hiện tại. - Tuy nhiên, lưu ý rằng dự án này cũ và dường như bị bỏ hoang.

+0

Cảm ơn, Lakshman. Tiện ích diff hoạt động rất tốt; thực sự, đó là những gì tôi đang sử dụng. Tôi đang tìm kiếm một tiện ích chạy qua tất cả các mô hình trong settings.INSTALLED_APPS và hiển thị sql cho mỗi, và sau đó SHOW CREATE TABLE sql trong DB, cho ra hai kết quả đầu ra tương tự trong cấu trúc có thể dễ dàng bị phân biệt. Tôi biết rằng có thể không hoàn toàn có thể tự động hóa, nhưng tôi đã tò mò nếu có ai đó giải quyết được vấn đề. –

+0

Jim, Đó là lý do tại sao tôi đã đề cập đến bạn để xem xét tiến hóa django. –

+0

Lakshman, tôi đã có một cái nhìn tại django-evolution. Có vẻ rất hữu ích cho việc bảo trì cơ sở dữ liệu; cám ơn vì đã chia sẻ. –

3

Tôi đã đưa ra một phương tiện nhanh chóng và dơ bẩn để làm những gì tôi mô tả. Nó không hoàn hảo, nhưng nếu bạn chạy ./manage.py testserver, cơ sở dữ liệu thử nghiệm sẽ được tạo dựa trên mã mẫu. Sau đó (sử dụng cú pháp MySQL cụ thể), bạn có thể đổ schema cho cơ sở dữ liệu thường xuyên và các cơ sở dữ liệu kiểm tra các tập tin:

$ mysqldump -uroot -p [database_name] --no-data=true > schema.txt 
$ mysqldump -uroot -p [test_database_name] --no-data=true > test_schema.txt 

Sau đó, bạn có thể chỉ đơn giản là schema.txt diff và test_schema.txt và tìm ra sự khác biệt.

+0

Nhanh chóng và dơ bẩn, và mức độ thấp! Tôi thích thực tế là sự khác biệt là trên lược đồ DB, đồng bằng và đơn giản. Cảm ơn. – Fafaman

2

Đối với PostgreSQL, hãy thực hiện manage.py syncdb trên cơ sở dữ liệu trống tạm thời, sau đó đổ sản xuất và cơ sở dữ liệu tạm thời bằng pg_dump -sOx và so sánh các tệp kết quả. Trong số các công cụ tìm kiếm trực quan, ít nhất GNOME Meld dường như đối phó tốt với các bãi PostgreSQL.

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