1

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__
Lord Elrond
  • 13,430
  • 7
  • 40
  • 80
Saisiva A
  • 595
  • 6
  • 24

2 Answers2

3

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
MSS
  • 3,306
  • 1
  • 19
  • 50
0

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
Saisiva A
  • 595
  • 6
  • 24
  • Consider accepting your own answer then. It will make it easier for others to find. – pfabri Feb 04 '21 at 15:37
  • 1
    `cursor = self.data_base_name.cursor()` will return an error `data_base_name.cursor() has no method cursor()`. I think you meant `cursor = self.data_base_connection.cursor()` please correct the corresponding line in your solution. – Nahid O. Mar 10 '21 at 17:34