sql >> データベース >  >> RDS >> Mysql

データベースリソースの適切な管理:カーソルと接続

    これは、Python コンテキストマネージャー の優れたユースケースのように思えます。 。コンテキストマネージャーを使用すると、リソースを適切に管理できます。 、データベース接続など、リソースのセットアップメソッドとティアダウンメソッドがどのように機能するかを指定できるようにする 。独自のカスタムコンテキストマネージャーは、次の2つの方法のいずれかで作成できます。まず、データベースクラスをラップし、コンテキストマネージャーに必要なメソッドを実装します。__init__()__enter__() 、および__exit__() 。次に、@contextmanagerを利用します 関数定義のデコレータと、その関数定義内のデータベースリソースのジェネレータを作成します。私は両方のアプローチを示し、どちらがあなたの好みであるかをあなたに決めさせます。 __init__() メソッドは初期化メソッドです カスタムPythonクラスに使用される初期化メソッドと同様に、カスタムコンテキストマネージャーの場合。 __enter__() メソッドはセットアップコードです カスタムコンテキストマネージャー用。最後に、__exit()__ メソッドは分解です カスタムコンテキストマネージャーのコード。 どちらのアプローチもこれらの方法を利用します 主な違いは、最初のメソッドがクラス定義内でこれらのメソッドを明示的に示すことです。 2番目のアプローチと同様に、ジェネレーターのyieldまでのすべてのコード ステートメントは、初期化およびセットアップコードです。 およびyieldの後のすべてのコード ステートメントは分解コードです。 また、ユーザーベースのデータベースアクションをユーザーモデルクラスに抽出することも検討します。次のようなもの:

    カスタムコンテキストマネージャー:(クラスベースのアプローチ ):

    import pymysql
    
    class MyDatabase():
        def __init__(self):
            self.host = '127.0.0.1'
            self.user = 'root'
            self.password = ''
            self.db = 'API'
    
            self.con = None
            self.cur = None
    
        def __enter__(self):
            # connect to database
            self.con = pymysql.connect(host=self.host, user=self.user, password=self.password, db=self.db, cursorclass=pymysql.cursors.DictCursor, autocommit=True)
            self.cur = self.con.cursor()
            return self.cur
    
        def __exit__(self, exc_type, exc_val, traceback):
            # params after self are for dealing with exceptions
            self.con.close()
    

    user.py(リファクタリング) :'

    # import your custom context manager created from the step above
    # if you called your custom context manager file my_database.py: from my_database import MyDatabase
    
    import <custom_context_manager>
    
    class User:
        def getUser(self, id):
            sql = 'SELECT * from users where id = %d'
            with MyDatabase() as db: 
                db.execute(sql, (id))
                result = db.fetchall()
    
            return result
    
        def getAllUsers(self):
            sql = 'SELECT * from users'
            with MyDatabase() as db: 
                db.execute(sql)
                result = db.fetchall()
            return result
    
        def AddUser(self, firstName, lastName, email):
            sql = "INSERT INTO `users` (`firstName`, `lastName`, `email`) VALUES (%s, %s, %s)"
            with MyDatabase() as db:
                db.execute(sql, (firstName, lastName, email))
    

    コンテキストマネージャー(デコレーターアプローチ)

    from contextlib import contextmanager
    import pymysql
    
    
    @contextmanager
    def my_database():
        try:
            host = '127.0.0.1'
            user = 'root'
            password = ''
            db = 'API'
            con = pymysql.connect(host=host, user=user, password=password, db=db, cursorclass=pymysql.cursors.DictCursor, autocommit=True)
            cur = con.cursor()
            yield cur
        finally:
            con.close()
    

    次に、User内で クラスでは、最初にファイルをインポートしてから、以前と同じように使用することで、コンテキストマネージャーを使用できます。

    with my_database() as db:
       sql = <whatever sql stmt you wish to execute>
       #db action 
       db.execute(sql)
    

    うまくいけば、それがお役に立てば幸いです!




    1. mysqlを介してテーブルで最も人気のある単語を取得するにはどうすればよいですか?

    2. Android:子テーブルを親テーブルと結合する方法Sqlite

    3. いずれかの列からユーザーIDを取得する単一行のフレンドシップデータベーススキーマ

    4. Excelデータから挿入ステートメントを生成してSQLServerテーブルにロードする方法-SQLServer/TSQLチュートリアルパート103