django db backends 탐색

5987 단어 django
django db 길이 연결 문제를 해결해야 하기 때문에 최근에 django db backend 관련 실현과 ORM을 봤습니다.
 
django db 구조
 
django.db는 두 부분으로 구성된 django ORM 패키지입니다.
  • django.db.models.
  • django.db.backends.

  • 코드의 구체적인 위치는/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)  
     

    좋은 웹페이지 즐겨찾기