I am learning dependency injection and trying to use this pattern on practice. I am trying to write simple program where the user can write something to database, delete row and clear all rows from db. So is it right realization of dependency injection?
import os
from enum import Enum
import pymysql
class Properties(Enum):
ID = 0
NAME = 1
class ConsoleManager:
def print_line(self) -> None:
print('-----------------\n')
return None
def print_data(self, data) -> None:
for row in data:
print(f"{row[Properties.ID.value]}\t|\t{row[Properties.NAME.value]}")
return None
class DatabaseManager:
def __init__(self, connection) -> None:
self.connection = connection
self.cursor = connection.cursor()
return None
def get_count_abobas(self) -> int:
self.cursor.execute('SELECT COUNT(*) FROM abobas')
count = self.cursor.fetchone()[0]
self.connection.commit()
return count
def insert_id_and_name(self, count, name) -> None:
sql = f'INSERT INTO abobas (id, abobas.aboba_name) VALUES ({count + 1}, \'{name}\')'
self.cursor.execute(sql)
self.connection.commit()
return None
def select_and_get_all_rows(self) -> tuple:
sql = "SELECT * FROM abobas ORDER BY id"
self.cursor.execute(sql)
result = self.cursor.fetchall()
self.connection.commit()
return result
def delete_by_name(self, name) -> None:
sql = f"DELETE FROM abobas WHERE aboba_name = '{name}'"
self.cursor.execute(sql)
self.connection.commit()
return None
def clear_table(self) -> None:
sql = 'DELETE FROM abobas'
self.cursor.execute(sql)
self.connection.commit()
return None
def update_id(self) -> None:
count = self.get_count_abobas()
for i in range(1, count + 1):
sql = f'UPDATE abobas SET id = {i} WHERE id > {i - 1} LIMIT 1'
self.cursor.execute(sql)
return None
class ConsoleService:
def __init__(self, console_manager, database_manager) -> None:
self.console_manager = console_manager
self.database_manager = database_manager
@staticmethod
def console_output(func):
def wrap(*args):
args[0].console_manager.print_line()
func(*args)
args[0].console_manager.print_line()
return wrap
@console_output
def write_to_db(self) -> None:
name = input("Enter name: ")
count = self.database_manager.get_count_abobas()
self.database_manager.insert_id_and_name(count, name)
print("Row successfully added to the table.")
@console_output
def read_from_file(self) -> None:
print('id\t|\tname')
self.console_manager.print_line()
result = self.database_manager.select_and_get_all_rows()
self.console_manager.print_data(result)
@console_output
def delete_by_name(self) -> None:
name = input('Enter the name to delete: ')
self.database_manager.delete_by_name(name)
self.database_manager.update_id()
print(f"An element with name {name} was successfully deleted.")
@console_output
def clear_all(self) -> None:
self.database_manager.clear_table()
print('Table is now clear.')
def main():
connection = pymysql.connect(
host='localhost',
user='sqluser',
password='password',
database='abobadb'
)
console_manager = ConsoleManager()
database_manager = DatabaseManager(connection)
console_service = ConsoleService(console_manager, database_manager)
while True:
os.system('cls||clear')
console_service.read_from_file()
print('Choose the option:\n\t1. Write to db.\n\t2. Delete by name.\n\t3. Clear all elements.')
choice = int(input("Enter your choice: "))
if choice == 1:
console_service.write_to_db()
elif choice == 2:
console_service.delete_by_name()
elif choice == 3:
console_service.clear_all()
else:
break
connection.close()
return None
if __name__ == '__main__':
main()
Also you can check my code and give me some advices in order to make my code clear and readable.
I have tried to implement dependency injection using classes DatabaseManager, ConsoleManager and ConsoleService.