django db backends 탐색
5987 단어 django
django db 구조
django.db는 두 부분으로 구성된 django ORM 패키지입니다.
코드의 구체적인 위치는/usr/local/lib/python2에 있습니다.7/dist-packages/django/db.일반적으로 django db를 사용하는 방법:
from django.db import connection
cursor = connection.cursor()
cursor.execute('select sleep(1);');
그 중
connection
django/db/에 정의init__.py:
connections = ConnectionHandler(settings.DATABASES)
router = ConnectionRouter(settings.DATABASE_ROUTERS)
connection = connections[DEFAULT_DB_ALIAS]
backend = load_backend(connection.settings_dict['ENGINE'])
2.dbbackend 구조
1.base backend
backend는django에 속합니다.db의 하위 디렉터리db.backends/__init__.py 정의 all backend-specific 에는 다음과 같은 몇 가지 중요한 클래스가 있습니다.
cursor(), close()와 같은 비교적 중요한 데이터베이스 연결 작업인 Base Database Wrapper Represents a database connection
BaseDatabaseFeatures 기능 스위치, 예를 들어supports 여부unspecified_pk
BaseDatabaseOperations This class encapsulates all backend-specific differences
BaseDatabaseIntrospection This class encapsulates all backend-specific introspection utilities
BaseDatabaseClient This class encapsulates all backend-specific methods for opening a client
BaseDatabaseValidation 검증 클래스는 구체적인 백엔드로 이루어집니다.
2.mysql backend
mysql 백엔드는 다음과 같은 6개의 파일만 있습니다. 대부분 분류는 백엔드에서 정의한Base:client에 계승됩니다.py BaseDatabaseClient는 BaseDatabaseClient에 계승되어 runshell()compiler를 실현했습니다.py SQLCompiler는django에 상속됩니다.db.models.sql.compiler.SQLCompiler creation.py DatabaseCreation This dictionary maps Field objects to their associated MySQL column introspection.py DatabaseIntrospection validation.py DatabaseValidation There are some field length restrictions for MySQL
base.py의 중요한pakcage는 mysql의 몇 가지 중요한 클래스를 정의합니다.
DatabaseWrapper mysql Database connection, Base DatabaseWrapper에 상속
CursorWrapper A thin wrapper around MySQLdb's normal cursor class
DatabaseFeatures는 BaseDatabaseFeatures에서 상속됨
DatabaseOperations는 BaseDatabaseOperations에서 상속됨
mongo db util
util.py는db의 일부 공공 방법과 클래스를 정의했습니다.db.init__.py 호출
load_backend()
ConnectionHandler
ConnectionRouter
4. 몇 가지 의문과 답안
1. Connection은 어떻게 생성되고 제거됩니까?
정답: Connection은 BaseDatabaseWrapper 패키지를 통해 매번 호출됩니다cursor () 에서 연결을 새로 만듭니다. mysql 구현은 다음과 같습니다.
def _cursor(self):
if not self._valid_connection():
kwargs = {
'conv': django_conversions,
'charset': 'utf8',
'use_unicode': True,
}
settings_dict = self.settings_dict
if settings_dict['USER']:
kwargs['user'] = settings_dict['USER']
if settings_dict['NAME']:
kwargs['db'] = settings_dict['NAME']
if settings_dict['PASSWORD']:
kwargs['passwd'] = settings_dict['PASSWORD']
if settings_dict['HOST'].startswith('/'):
kwargs['unix_socket'] = settings_dict['HOST']
elif settings_dict['HOST']:
kwargs['host'] = settings_dict['HOST']
if settings_dict['PORT']:
kwargs['port'] = int(settings_dict['PORT'])
# We need the number of potentially affected rows after an
# "UPDATE", not the number of changed rows.
kwargs['client_flag'] = CLIENT.FOUND_ROWS
kwargs.update(settings_dict['OPTIONS'])
self.connection = Database.connect(**kwargs)
self.connection.encoders[SafeUnicode] = self.connection.encoders[unicode]
self.connection.encoders[SafeString] = self.connection.encoders[str]
connection_created.send(sender=self.__class__, connection=self)
cursor = CursorWrapper(self.connection.cursor())
return cursor
그 중
self.connection = Database.connect(**kwargs)
Connection을 초기화하고 CursorWrapper를 반환하는 것입니다.close는BaseDatabaseWrapper()에서db.init__.py의close() 방법 호출, 코드는 다음과 같습니다
def close(self):
if self.connection is not None:
self.connection.close()
self.connection = None
2.ql문장은 어떻게 실행합니까?
정답: CursorWrapper를 통해 exucute()를 호출합니다.
3. 어떻게django 데이터베이스에 긴 연결을 유지합니까?
정답:db.init__.py에서 connection을 정의했습니다. 요청이 끝날 때마다close ():
# Register an event that closes the database connection
# when a Django request is finished.
def close_connection(**kwargs):
for conn in connections.all():
conn.close()
signals.request_finished.connect(close_connection)
만약 Django가 요청이 끝난 후에 모든 연결을 닫지 않기를 원하지 않는다면, 상기 마지막 줄의 코드를 설명할 수 있습니다.
테스트를 통해 이렇게 하면 연결을 유지하는 요구에 도달할 수 있다.그러나 이런 Django 내부 코드를 수정하는 방식이 너무 횡포하기 때문에 마지막 줄 코드와 관련된Signal 대상을 계속 연구한 결과 그 중에disconnect 방법이 하나 더 있어 신호 관련 취소를 실현해야 하기 때문에django 프로젝트에서settings를 사용할 수 있다.py 파일은 데이터베이스 길이의 연결을 유지하는 비패도 조작을 실현하기 위해 다음과 같은 코드를 추가합니다.
from django.core import signals
from django.db import close_connection
# ,
signals.request_finished.disconnect(close_connection)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.