I'm working in a proyect to read and update data from a mysql database. I need several functions to perform different actions. I show them to the user in a menu. I did my research about how to structure the code but I still have some doubts.
I understand using context managers for db connection and cursor is the best practice. Also, I understand using only one db connection and one cursor objects is the best option to optimize code and to avoid server connections overload. I'm right? Following this ideas, I structured my code as follows:
# Database connection base class
class Database:
# Setup connection
def __init__(self):
# data (host, pass, port, etc)
# Start connection
def __enter__(self):
# create and return connection object
# Disconnect
def __exit__(self, exc_type, exc_value, exc_tb):
# close() connection
# Functions
def function_1(self, cursor):
cursor.execute(query1)
def function_2(self, cursor):
cursor.execute(query2)
def function_3(self, cursor):
cursor.execute(query3)
# Cursor base class
class Cursor:
def __enter__(self):
# create and return cursor object
def __exit__(self, exc_type, exc_value, exc_tb):
# close() cursor
# main.py
with Database() as db:
with Cursor() as cursor:
while True:
print("MAIN MENU")
option = input("1. function 1\n2. function 2\n3.function 3\n4. Exit")
if option == '1':
db.function_1(cursor)
if option == '2':
db.function_2(cursor)
if option == '3':
db.function_3(cursor)
if option == '4':
sys.exit()
MY QUESTIONS:
- Is it okay to have the main menu (infinite loop) in the
with
block? - Is it okay to use only one connection and one cursor, for several functions? If yes, it's correct an implementation like the previous code? If not, should I start a new connection and cursor for each function?.
posts used as reference: Proper management of database resources: cursor and connection