I try to make a library managment system and I started with database methods on python. I'm using mysql and I made connector but when I was trying to control methods I took a error. In fact, it wasn't error but I can't compare that I wanted database and tables with current database and tables.
import mysql.connector
class Db_Control():
def __init__(self):
self.mydb = None
self.cursor = None
self.planned_list = [
["categories_db","`ID` int NOT NULL AUTO_INCREMENT,`Name` varchar(100) NOT NULL,PRIMARY KEY (`ID`)"],
["books_db","`ID` int NOT NULL AUTO_INCREMENT,`Name` varchar(100) NOT NULL,`Page_Number` int NOT NULL,`First_Release_Year` varchar(100) NOT NULL,`E_Book_Link` varchar(100) NOT NULL,`Audio_Book_Link` varchar(100) NOT NULL,PRIMARY KEY (`ID`)"],
["books_categories_relationship_db","`Book_Id` int NOT NULL,`Category_Id` int NOT NULL,PRIMARY KEY (`Book_Id`,`Category_Id`),KEY `Category_Id` (`Category_Id`),CONSTRAINT `books_categories_relationship_db_ibfk_1` FOREIGN KEY (`Book_Id`) REFERENCES `books_db` (`ID`),CONSTRAINT `books_categories_relationship_db_ibfk_2` FOREIGN KEY (`Category_Id`) REFERENCES `categories_db` (`ID`)"],
["authors_db","`ID` int NOT NULL AUTO_INCREMENT,`Name` varchar(100) NOT NULL,`Surname` varchar(100) NOT NULL,`Birth_Year` varchar(100) NOT NULL,`Death_Year` varchar(100) NOT NULL,PRIMARY KEY (`ID`)"],
["books_authors_relationship_db","`Book_Id` int NOT NULL,`Author_Id` int NOT NULL,PRIMARY KEY (`Book_Id`,`Author_Id`),KEY `Author_Id` (`Author_Id`)"],
["places_db","`ID` int NOT NULL AUTO_INCREMENT,`Country` varchar(100) NOT NULL,`City` varchar(100) NOT NULL,PRIMARY KEY (`ID`)"],
["authority_db","`ID` int NOT NULL AUTO_INCREMENT,`Authority` varchar(100) NOT NULL,PRIMARY KEY (`ID`)"],
["users_db","`ID` int NOT NULL AUTO_INCREMENT,`Name` varchar(100) NOT NULL,`Surname` varchar(100) NOT NULL,`Email` varchar(100) NOT NULL,`Password` varchar(100) NOT NULL,`Place_Id` int NOT NULL,`Authority_Id` int NOT NULL,PRIMARY KEY (`ID`),KEY `Place_Id` (`Place_Id`),KEY `Authority_Id` (`Authority_Id`),CONSTRAINT `users_db_ibfk_1` FOREIGN KEY (`Place_Id`) REFERENCES `places_db` (`ID`),CONSTRAINT `users_db_ibfk_2` FOREIGN KEY (`Authority_Id`) REFERENCES `authority_db` (`ID`)"],
["image_db","`ID` int NOT NULL AUTO_INCREMENT,`Image_Link` varchar(100) NOT NULL,PRIMARY KEY (`ID`)"],
["images_users_books_relationship_db","`User_Id` int NOT NULL,`Book_Id` int NOT NULL,`Image_Id` int NOT NULL,PRIMARY KEY (`User_Id`,`Book_Id`,`Image_Id`),KEY `Book_Id` (`Book_Id`),KEY `Image_Id` (`Image_Id`),CONSTRAINT `images_users_books_relationship_db_ibfk_1` FOREIGN KEY (`User_Id`) REFERENCES `users_db` (`ID`),CONSTRAINT `images_users_books_relationship_db_ibfk_2` FOREIGN KEY (`Book_Id`) REFERENCES `books_db` (`ID`),CONSTRAINT `images_users_books_relationship_db_ibfk_3` FOREIGN KEY (`Image_Id`) REFERENCES `image_db` (`ID`)"],
["comments_db","`ID` int NOT NULL AUTO_INCREMENT,`User_Id` int NOT NULL,`Comment` varchar(100) NOT NULL,`Date` varchar(100) NOT NULL,`Time` varchar(100) NOT NULL,PRIMARY KEY (`ID`),KEY `User_Id` (`User_Id`),CONSTRAINT `comments_db_ibfk_1` FOREIGN KEY (`User_Id`) REFERENCES `users_db` (`ID`)"],
["likes_dislikes_db","`ID` int NOT NULL AUTO_INCREMENT,`Action_Type` varchar(100) NOT NULL,PRIMARY KEY (`ID`)"],
["likes_dislikes_user_relationship_db","`ID` int NOT NULL AUTO_INCREMENT,`User_Id` int NOT NULL,`Action_Type_Id` int NOT NULL,`Date` varchar(100) NOT NULL,`Time` varchar(100) NOT NULL,PRIMARY KEY (`ID`),KEY `User_Id` (`User_Id`),KEY `Action_Type_Id` (`Action_Type_Id`),CONSTRAINT `likes_dislikes_user_relationship_db_ibfk_1` FOREIGN KEY (`User_Id`) REFERENCES `users_db` (`ID`),CONSTRAINT `likes_dislikes_user_relationship_db_ibfk_2` FOREIGN KEY (`Action_Type_Id`) REFERENCES `likes_dislikes_db` (`ID`)"]
] # Oluşturulacak veya silinecek tabloların listesi
def find_differences_list(self, list1, list2): # İki listeyi karşılaştırarak farklılıkları bulan fonksiyon
differences_list = set(list1).difference(set(list2))
return differences_list
def find_intersection_list(self, list1, list2): # İki liste arasındaki kesişimi bulan fonksiyon
formatted_list1 = [item[0] for item in list1]
intersections_list = [item for item in formatted_list1 if item in list2]
return intersections_list
def drop_all_tables(self, tables): # Verilen tabloları silecek olan fonksiyon
self.cursor.execute("SET FOREIGN_KEY_CHECKS = 0")
for table in tables:
table_name = table[0]
self.cursor.execute(f"DROP TABLE {table_name}")
self.cursor.execute("SET FOREIGN_KEY_CHECKS = 1")
def create_wanted_tables(self, wanted_table_list): # Verilen tablo listesindeki tabloları oluşturacak olan fonksiyon
mycursor = self.mydb.cursor()
for element_tabel_list in wanted_table_list:
element_name = element_tabel_list[0]
element_code = element_tabel_list[1]
self.cursor.execute(f"CREATE TABLE {element_name} ({element_code})")
def connect_mysql(self, host1, port1, user1, password1): # MySQL veritabanına bağlantı kuracak olan fonksiyon
try:
self.mydb = mysql.connector.connect(
host=host1,
port=port1,
user=user1,
password=password1,
)
self.cursor = self.mydb.cursor()
except Exception as err:
print(f"Error: {err}")
def control_db(self, host1, port1, user1, password1): # Veritabanını kontrol edecek olan ana fonksiyon
try:
self.connect_mysql(host1, port1, user1, password1)
mycursor = self.mydb.cursor()
mycursor.execute("SHOW DATABASES")
databases = [db[0] for db in mycursor.fetchall()]
target_database = 'library_managment_system'
target_tables = [(name[0],) for name in self.planned_list] # İstenilen Tablo İsimleri Girilmeli
if target_database in databases:
mycursor.execute(f"USE {target_database}")
mycursor.execute("SHOW TABLES")
tables = mycursor.fetchall()
print("Tables in Database:")
print(tables)
print("Target Tables:")
print(target_tables)
if (self.find_intersection_list(target_tables,tables)): # Aynı Olup Olmadığını Sorgular
print("Failure")
else:
print("Success")
self.drop_all_tables(tables)
self.create_wanted_tables(self.planned_list)
else:
mycursor.execute(f"CREATE DATABASE {target_database}")
mycursor.execute(f"USE {target_database}")
except Exception as err:
print(f"Error: {err}")
# Örnek kullanım
Db_Control().control_db("127.0.0.2", "3306", "root", "password")
And they're my outputs:
Tables in Database: [('authority_db',), ('authors_db',), ('books_authors_relationship_db',), ('books_categories_relationship_db',), ('books_db',), ('categories_db',), ('comments_db',), ('image_db',), ('images_users_books_relationship_db',), ('likes_dislikes_user_relationship_db',), ('places_db',), ('users_db',)] Target Tables: [('categories_db',), ('books_db',), ('books_categories_relationship_db',), ('authors_db',), ('books_authors_relationship_db',), ('places_db',), ('authority_db',), ('users_db',), ('image_db',), ('images_users_books_relationship_db',), ('comments_db',), ('likes_dislikes_db',), ('likes_dislikes_user_relationship_db',)] Success
I didn't manage to find a solution to line 74. I tried different things but I couldn't accomplish to fix.
I tried to intersection method with using set() but it didn't work.If you can show my fault, it will be very nice.