FAQ: 데이터베이스와 모델

Django 실행 중 저수준의 SQL 질의는 어떻게 확인하나요?

먼저 Django의 DEBUG 설정을 True로 변경하세요. 그리고 아래와 같이 따라하세요.

>>> from django.db import connection
>>> connection.queries
[{'sql': 'SELECT polls_polls.id,polls_polls.question,polls_polls.pub_date FROM polls_polls',
'time': '0.002'}]

connection.queriesDEBUG 설정이 True일 때만 사용할 수 있습니다. 실행 결과는 질의 실행 순서로 구성된 사전의 리스트로 이루어져 있으며 각각의 사전은 아래의 항목을 포함하고 있습니다.

``sql`` -- 저수준 SQL 문
``time`` -- SQL 문의 실행 시간(초 단위).

connection.queries는 INSERT, UPDATE, SELECT 등 수행하는 모든 SQL 문을 포함하고 있습니다. 여러분의 앱이 데이터베이스를 사용할 때마다 모든 쿼리가 기록됩니다. 참고로 이곳에 기록되는 SQL은 SQLite에서 인용부호의 불일치가 발생할 수 있습니다.

New in Django 1.2: Please see the release notes

만약 여러분이 다중 데이터페이스를 사용하고 있다면, 각각의 connections 사전에 대해 동일한 인터페이스를 사용할 수 있습니다.

>>> from django.db import connections
>>> connections['my_db_alias'].queries

기존에 사용하던 데이터베이스를 Django와 함께 사용할 수 있나요?

물론입니다. 레거시(legacy) 데이터베이스와 통합하기를 참조하세요.

모델을 수정하게 될 경우 어떻게 데이터베이스에 적용하나요?

만약 데이터가 초기화되어도 괜찮다면, 여러분의 프로젝트에 있는 manage.py 유틸리티의 옵션을 사용하여 특정 애플리케이션의 SQL을 초기화 시킬 수 있습니다.

manage.py reset appname

위의 명령은 특정 appname과 관련된 모든 테이블을 삭제하고 다시 생성합니다.

만약 데이터가 삭제되지 않길 원할 경우, 데이터베이스에 ALTER TABLE 문을 실행하여 수동으로 적용할 수 있습니다.

몇 가지 스키마 업데이트를 다루는 외부 프로젝트가 진행중이며, south가 사실상 표준으로 널리 사용되고 있습니다.

Django 모델은 다중 컬럼 기본 키를 제공하나요?

아니요. 단일 컬럼 기본 키만 제공합니다.

이것은 실제로 큰 문제가 되지 않습니다. 여러분은 unique_together 모델 옵션을 사용하거나 데이터베이스에 직접 제약조건을 생성함으로써 유일성을 보장할 수 있습니다. 단일 컬럼 기본 키는 보다 쉽게 특정 개체를 수정, 삭제하기 위한 관리자 인터페이스 등을 위해 필요합니다.

CREATE TABLE 문에 테이블 타입으로 MyISAM을 설정하는 등의 데이터베이스 옵션을 추가할 수 있나요?

우리는 Django 코드에 테이블 타입 등의 특정 데이터베이스에 종속되는 옵션들이 포함되는 등의 특별한 상황을 최대한 피하고자 합니다. 만약 여러분이 이런 옵션을 사용하고자 한다면, 여러분이 원하는 ALTER TABLE 문을 포함하는 SQL 초기 데이터 파일을 생성하세요. 초기 데이터 파일은 CREATE TABLE 문 다음으로 실행됩니다.

예를 들어, 여러분이 MySQL을 사용하고 MyISAM 테이블 타입의 테이블을 사용하고자 한다면, 초기 데이터 파일을 생성한 후 다음과 같이 입력해 주세요.

ALTER TABLE myapp_mytable ENGINE=MyISAM;

SQL 초기 데이터 파일 문서에서 설명한 바와 같이, 이 SQL 파일은 임의의 SQL을 포함하며, 여러분은 여러분이 원하는 어떠한 수정사항들도 만들 수 있습니다.

Django는 왜 메모리 누수를 일으키나요?

Django에서 메모리 누수를 일으키는 문제는 알려져있지 않습니다. 만약 여러분의 Django 프로세스가 메모리를 점점 더 많이 사용하면서 반납하지 않고 있다면 DEBUG 설정이 False 로 설정되어 있는지 확인하세요. 만약 DEBUGTrue라면, Django는 실행되는 모든 SQL 문의 복사본을 저장합니다.

(모든 질의는 django.db.connection.queries에 저장됩니다. `Django 실행 중 날(raw) SQL 질의는 어떻게 확인하나요?`_를 참고하세요.)

이 문제를 해결하기 위해, DEBUGFalse로 설정하세요.

만약 여러분의 함수 어느곳에서든 질의 목록을 수동으로 삭제하고자 한다면, 아래와 같이 reset_queries()를 호출하세요.

from django import db
db.reset_queries()