파이썬으로 미니 ORM을 어떻게 만들었을까?

소개



Django 웹 프레임워크에서 코딩할 때 데이터베이스를 직접 사용하지 않는다는 것을 우리 모두 알고 있습니다. 마이그레이션 및 SQL 작업을 사용하여 데이터베이스와 상호 작용하는 ORM(Object Relational mapping)이 있습니다. 따라서 이 튜토리얼에서는 처음부터 ORM 관리자를 구현하는 방법을 보여드리고자 합니다.

컴퓨터 과학의 객체 관계형 매핑(ORM)은 가상 데이터베이스 객체를 만들기 위해 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형 시스템 간에 데이터를 변환하는 기술입니다.

Python은 원하는 모든 것을 자유롭게 디자인할 수 있는 프로그래밍 언어입니다.

그리고 솔직히 3시간 만에 Mini ORM 관리자를 구현할 수 있었습니다.

의제


  • Project Design
  • Database manager
  • Model manager
  • Migration manager
  • Conclusion

  • 프로젝트 디자인

    Our Project is divided into 3 main components:

    • A connection manager to connect directly with a database using SQL commands (we used SQLite3 in our case).
    • A model manager or model file that contains all the definition of the models we need to migrate to a database.
    • A simple command manager that enables user to input a command (in the command prompt).
    The Project files are also 3 python files (check this Github 저장소 ):


    파이썬 파일
    기능


    migrate_manager.py
    마이그레이션 관리자

    base.py
    모델 매니저

    db_manager.py
    데이터베이스 관리자


    데이터베이스 관리자

    We mentioned before that we will use SQLite database. Thanks to python sqlite3 default library, we can connect directly with a database using a python script. If you check the documentation of sqlite3 라이브러리에서 파이썬을 사용하여 SQLite를 연결하는 것이 매우 쉽다는 것을 알 수 있습니다.

    파이썬 코드 몇 줄이면 충분합니다. 따라서 데이터베이스 파일 "example.db "을 지정하여 sqlite3 연결 개체를 인스턴스화한 다음 변경 사항을 커밋하고 연결을 닫는 것을 잊지 않고 SQL 명령을 실행할 커서를 만들어야 합니다.

    먼저 sqlite3 라이브러리를 가져오고 연결을 인스턴스화합니다.

    import sqlite3
    con = sqlite3.connect('example.db')
    


    그런 다음 커서를 열고 원하는 명령을 실행한 다음 마지막으로 연결을 닫습니다.

    cursor= con.cursor()
    cursor.execute('''CREATE TABLE stocks (date text, trans text, symbol text, qty real, price real)''')
    cursor.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
    connection.commit()
    connection.close()
    


    그러나 이러한 종류의 구현은 이 코드 블록의 중복이 너무 많기 때문에 우리 프로젝트에서 신뢰할 수 없습니다. CREATE, DELETE, UPDATE 및 RETRIEVE를 포함하여 사용하는 모든 SQL 작업에서 이 코드를 반복한다고 상상해 보십시오.

    사실 이 문제에는 해결책이 있는데, 파이썬에는 컨텍스트 관리자라는 것이 있습니다. 컨텍스트 관리자는 복잡성과 메모리 비용 없이 리소스를 정확하게 관리하는 방법입니다.

    데이터베이스와 연결할 수 있는 컨텍스트 관리자를 만들기 위해 SQL 연결을 열고 커서 개체를 인스턴스화하는 ConnectionSqliteManager라는 클래스를 만듭니다.

    이 클래스에서는 데이터베이스 리소스 관리에 필요한 요소로 __enter____exit__ 매직 클래스 메서드를 작성해야 합니다.

    따라서 컨텍스트 관리자 클래스의 구조는 다음과 같습니다.
  • __enter__ 메서드는 example.db 파일(설정 작업)을 연결하고 Connection 개체를 Connection 변수에 반환합니다.
  • __exit__ 메서드는 with 블록 종료(해제 작업) 시 연결 종료를 처리합니다.

  • 범위with에서는 연결을 열고 닫는 번거로움 없이 범위 내에서 데이터베이스를 관리합니다.

    class ConnectionSqliteManager:
        def __init__(self,filename):
            self.filename = filename
    
        def __enter__(self):
            print("Connection started ...")
            self.connection = sql3.connect(self.filename)
            self.cursor = self.connection.cursor()
            return self  
        def __exit__(self, type, value, traceback):
            print("Connection ended ...")
            self.connection.close()
    
    with ConnectionSqliteManager("example.db") as Connection:
        # Do what you want with Connection instance
    


    팁:



    각 SQL 작업 메서드 위에 데코레이터("ConnectionSqliteManager"클래스 내부)를 만들어 변경 사항을 커밋할 수 있습니다.

    각 명령 실행에서 일부 sqlite3 오류 예외를 추가하는 것을 잊지 마십시오.

    #inside ConnectionSqliteManager class
    def commit(operation):
            def wrapper(self, *args,**kwargs):
                operation(self, *args, **kwargs)
                self.connection.commit()
            return wrapper
    @commit
    def Sql_operation(self):
        # execute an sql command here
        pass
    


    모델 매니저

    A model is a datastore entity that has a key and a set of properties. . A model is a Python class that inherits from the Model class. The model class defines a new kind of datastore entity and the properties the kind is expected to take.

    I won’t dive into too much implementation here. all you have to do is to define a model class like the following:

    class Model(baseModel):
        base_model = base
        tablename = "Model"
        fields = ("field_1", "field_2")
    

    In this code, you need to specify the name of the table of the database and its fields.

    In order to prepare your model for migration, you have to add it in the model_list list:

    model_list = [Model,
                  ]
    

    명령 관리자

    Now let’s prepare the user for a good interface in our command prompt. To implement it, we used the argparse default library to let the user input the arguments in the command prompt and execute the migration.

    all details are in the migrate_manager.py file , 코드의 각 줄을 설명할 필요가 없습니다. 최대한 간단하게 만들었습니다.

    따라서 다음 명령을 실행하기만 하면 됩니다.

    python migrate_manager.py migrate
    


    출력은 다음과 같습니다.

    Begin database Migration ...
    
    Model Migration
    Connection started ...
    Model: created successfully!
    2022-01-04 02:29:53.402991: Commit is successful!!
    Connection ended ...
    


    결론

    It’s good to implement from scratch a technique like ORM, it will help you understand and learn quickly technologies without any difficulties with grasping the concept behind.

    좋은 웹페이지 즐겨찾기