Reputation: 615
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
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
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