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

PythonのMySQLdbのコンテキストマネージャー

    以前 、MySQLdb接続はコンテキストマネージャーでした。2018-12-04のこのコミット ただし、MySQLdb接続はコンテキストマネージャーではなくなったため、ユーザーはconn.commit()またはconn.rollback()を明示的に呼び出すか、以下のような独自のコンテキストマネージャーを作成する必要があります。

    次のようなものを使用できます:

    import config
    import MySQLdb
    import MySQLdb.cursors as mc
    import _mysql_exceptions
    import contextlib
    DictCursor = mc.DictCursor
    SSCursor = mc.SSCursor
    SSDictCursor = mc.SSDictCursor
    Cursor = mc.Cursor
    
    @contextlib.contextmanager
    def connection(cursorclass=Cursor,
                   host=config.HOST, user=config.USER,
                   passwd=config.PASS, dbname=config.MYDB,
                   driver=MySQLdb):
        connection = driver.connect(
                host=host, user=user, passwd=passwd, db=dbname,
                cursorclass=cursorclass)
        try:
            yield connection
        except Exception:
            connection.rollback()
            raise
        else:
            connection.commit()
        finally:
            connection.close()
    
    @contextlib.contextmanager
    def cursor(cursorclass=Cursor, host=config.HOST, user=config.USER,
               passwd=config.PASS, dbname=config.MYDB):
        with connection(cursorclass, host, user, passwd, dbname) as conn:
            cursor = conn.cursor()
            try:
                yield cursor
            finally:
                cursor.close()
    
    
    with cursor(SSDictCursor) as cur:
        print(cur)
        connection = cur.connection
        print(connection)
        sql = 'select * from table'
        cur.execute(sql)
        for row in cur:
            print(row)
    

    これを使用するには、config.pyを配置します PYTHONPATHで、HOST、USER、PASS、MYDB変数を定義します。



    1. 2つのフィールドの値が同じであるレコードの作成を防ぐにはどうすればよいですか?

    2. SpotlightCloudによるAzureSQLDBアナウンスのサポート(プレビュー)

    3. PHP 5.4 PDOは、古い安全でない認証を使用してMySQL4.1以降に接続できませんでした

    4. PostgreSQLで2つの日付の間の労働時間を計算します