Saisiva A
Saisiva A

Reputation: 615

AttributeError: __enter__ During connection to mysql database

I am getting AttributeError: __enter__ while executing the following code to get connection and cursor.

from contextlib import closing
def _connect():
    return closing(mysql.connect(
        host=settings.DATABASES['data_base_name'].get('HOST', 'localhost'),
        user=settings.DATABASES['data_base_name']['USER'],
        passwd=settings.DATABASES['data_base_name'].get('PASSWORD', ''),
        db=settings.DATABASES['data_base_name']['NAME'],
        cursorclass=cursors.DictCursor))

with _connect() as conn, conn as cursor:

I have got following error during execution.

with _connect() as conn, conn as cursor:
 AttributeError: __enter__

Upvotes: 1

Views: 4308

Answers (2)

MSS
MSS

Reputation: 3633

You can also do it with your initial approach in this way. You don't need to create a class. Internally it will do exactly what you have done by creating a class but the code is more succinct IMHO.

from contextlib import contextmanager

@contextmanager
def _connect():
    data_base_connection = mysql.connect(
    host=settings.DATABASES['data_base_name'].get('HOST', 'localhost'),
    user=settings.DATABASES['data_base_name']['USER'],
    passwd=settings.DATABASES['data_base_name'].get('PASSWORD', ''),
    db=settings.DATABASES['data_base_name']['NAME'],
    cursorclass=cursors.DictCursor)
    try:
       yield data_base_connection
    finally:
        data_base_connection.close()

def query_tables():
    with _connect() as conn:
        cursor = conn.cursor()
        # rest of the statements

Upvotes: 3

Saisiva A
Saisiva A

Reputation: 615

I have solved my problem with ContextDecorator as below.

from contextlib import ContextDecorator

class my_connect(ContextDecorator):
    def __init__(self):
        self.data_base_connection = ''

    def __enter__(self):
        self.data_base_connection = mysql.connect(
        host=settings.DATABASES['data_base_name'].get('HOST', 'localhost'),
        user=settings.DATABASES['data_base_name']['USER'],
        passwd=settings.DATABASES['data_base_name'].get('PASSWORD', ''),
        db=settings.DATABASES['data_base_name']['NAME'],
        cursorclass=cursors.DictCursor)
        cursor = self.data_base_connection.cursor()
        return cursor

    def __exit__(self, *exc):
        self.data_base_connection.close()
        return False

In query_tables() i just call my_connect() with with keyword

def query_tables():
    with my_connect() as cursor:
        #rest of the statements

Upvotes: 0

Related Questions