2010-08-23 4 views
8

실제 데이터베이스와 동기화되지 않은 여러 모델 제약 조건이있는 데이터베이스로 Django 프로젝트를 유지 관리합니다. 예를 들어, 일부 모델 필드는 null = False 세트가 있지만 데이터베이스는 해당 데이터베이스 열에 대해 NULL을 허용합니다.Django - 모델 코드와 데이터베이스 비교

Django 또는 제 3 자 Python 스크립트에서 각 테이블에 대해 SHOW CREATE TABLE 출력 (이 경우 MySQL 구문 사용)을 비교하고이 테이블과 비교할 유틸리티가 있는지 궁금합니다. python manage.py sql output을 사용하여 불일치를 강조 표시합니다.

이상적인 상황에서는 데이터베이스가 처음에는 장고 모델 코드와 동기화되지 않을 것이지만 그 이후로 나는이 문제에 대한 해결책이 있는지 궁금하다. 직접 작성하거나 수동으로 비교하십시오.

+0

diff 도구와 비교해보십시오. http://www.quickdiff.com/index.php? –

+0

@ Gabi- 그게 내가 손으로하고있는 것. 누군가가 쉽게 구분할 수있는 각각의 출력물을 생성하는 유틸리티를 만든다면 궁금합니다. 지금 당장은 정상적으로 작동하지만 각 출력이 정렬되지 않으므로 테이블별로 테이블을 만들어야합니다. –

답변

4

./manage.py inspectdb은 데이터베이스 내에 존재하는 모델에 해당하는 모델 파일을 생성합니다.

차이점을 찾고 마이그레이션 전략을 계획하려면 표준 unix diff 또는 기타 diffing tool을 사용하여 현재 모델 파일과 차별화 할 수 있습니다.

이전 버전이 더 간단하고 더 나은 것처럼 보이지만 SQL 수준에서 diff를 볼 수도 있습니다. ./manage.py sqlall은 현재 db 스키마에 대해 sql을 생성하며 이에 따라 show create table table-name은 테이블 생성을위한 sql을 표시합니다.

한 번 자동으로 데이터베이스의 상태를 현재 모델로 마이그레이션 한 http://code.google.com/p/django-evolution/을 참조 할 수 있습니다. 그러나이 프로젝트는 오래되었고 버려진 것 같습니다.

+0

고마워, 락맨. diff 유틸리티는 매우 잘 작동합니다. 실제로, 그것은 내가 사용하고있는 것이다. 내가 settings.INSTALLED_APPS 모든 모델을 통해 실행하고 각각에 대한 SQL을 표시 유틸리티를 찾고 있었는데, 다음 테이블에 SQL을 표시, DB에서 쉽게 diffed 수있는 구조에서 비슷한 두 개의 산출물을 낳는다. 자동화가 전적으로 가능하지 않을 수도 있지만, 문제가 해결되면 궁금합니다. –

+0

짐, 그래서 나는 장고 진화를보기 위해 당신을 언급했다. –

+0

락맨, 장고 진화에 대해 살펴 보았습니다. 데이터베이스 유지 관리에 매우 유용합니다. 공유해 주셔서 감사합니다. –

3

나는 내가 설명한 것을 빠르고 더러운 방법으로 생각해 냈습니다. 완벽하지는 않지만 ./manage.py testserver을 실행하면 모델 데이터베이스를 기반으로 테스트 데이터베이스가 생성됩니다. 그런 다음 (구문 MySQL의 특정 사용), 당신은 파일에 정기적으로 데이터베이스와 테스트 데이터베이스의 스키마를 덤프 할 수 있습니다

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

그런 다음 당신은 단순히 사랑하는 schema.txt 및 test_schema.txt과는 차이를 찾을 수 있습니다.

+0

빠르고, 더럽고, 낮은 수준! 나는 diff가 DB 스키마에 있다는 사실을 좋아합니다. 간단하고 간단합니다. 감사. – Fafaman

2

PostgreSQL의 경우 임시 빈 데이터베이스에 manage.py syncdb을 입력 한 다음 생산 및 임시 데이터베이스를 pg_dump -sOx으로 덤프하고 결과 파일을 비교하십시오. 시각적 인 diff 도구 중에서 적어도 GNOME Meld는 PostgreSQL 덤프에 잘 대처하는 것 같습니다.