I can't compare two databases

51 views Asked by At

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.

0

There are 0 answers