0

i have this function which used to connect to mysql servers the SqlConnector function is the main function which used to connect to the servers and import the query results the user have two option one is to get the current available locations and second is to get the all locations data while the connection is success and get data until all the lists ip's are connected IterativeOrNotRun function is used to defined the behavior of the SqlConnector function if self.IterativeOrNot True of False the behavior will depend i used the while len(self.IPLists) != 0 to iterate the list until 0 but the code doesn't work.What is wrong with the code?

class MySQLImporter():
    def __init__(self,Query,Filename,choices,FileExtension,IterativeOrNot):
        self.DataFramesStack = []
        
        self.userdir = os.path.expanduser('~')
        self.userdir = self.userdir+'\\Documents\\'
        self.Filename = self.userdir+Filename
        self.choices = choices
        self.IterativeOrNot = IterativeOrNot
        self.LocationDictionary = LocationDict
        self.IPLists = AllLocsIPToList(self.LocationDictionary,self.choices)
        self.IPLists.reverse()
        self.Query = Query
        self.FileExtension = FileExtension
        self.FailedLocationList = []
        FolderCreate(self.Filename)
        
        self.c1_List = []
        self.c2_List  = []
        self.c3_List  = []
        self.c4_List  = []

    def CenterListDfAppend(self,df,CenterType):
        if CenterType == 'c1':
            self.c1_List.append(df)
        elif CenterType == 'c2':
            self.c2_List.append(df)
        elif CenterType == 'c3':
            self.c3_List.append(df)
        elif CenterType == 'c4':
            self.c4_List.append(df)

    def AddFailedIp(self,ip):
        if ip not in self.FailedLocationList:
            self.FailedLocationList.append(ip)
    def RmFailedIp(self,ip):
        if ip in self.FailedLocationList:
            self.FailedLocationList.remove(ip)

    def SqlConnector(self):
       
        
        for ip in reversed(self.IPLists):
            CenterAndLocationName = ReturnCenter_Type_Name(ip,self.LocationDictionary)
            Center_Type = CenterAndLocationName[0]
            Location_Name = CenterAndLocationName[1]
            CenterWiseFolderCreate(self.Filename,Center_Type)
            try:
                cnx = mysql.connector.connect(user=usr,password=passwd,host=ip,database=db,port=3306)


                if cnx.is_connected():
                    print("\nConnection Succesfull {} : {}".format(Location_Name,Center_Type))
                    print("Remaining Location Count {}".format(len(self.IPLists)-1))
                    print("Failed Location Count {}\n".format(len(self.FailedLocationList)))
                    self.RmFailedIp(ip)
                    LocationCode = cnx.cursor(buffered=True)
                    LocationCode.execute("select location from syspara")
                    LocationCode = LocationCode.fetchone()[0]
                   


                    QueryCursor = cnx.cursor()
                    QueryCursor.execute(self.Query)

                    df = pd.DataFrame(QueryCursor.fetchall())
                    df = df.reset_index(drop=True)

                    Location_Name_Excel = self.Filename + '/' + Center_Type + '/' + LocationCode + '.' + self.FileExtension

                    if not df.empty:
                        self.DataFramesStack.append(df)
                        self.CenterListDfAppend(df,Center_Type)
                        Field_Names =[ i[0] for i in  QueryCursor.description]
                        df.columns = Field_Names
                        ExcelSaver(df,Location_Name_Excel,self.FileExtension)
                    self.IPLists.remove(ip)
                    cnx.close()

            except mysql.connector.Error as err:
                self.AddFailedIp(ip)
                if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
                    print("Something Wrong With Your Username Or Password")
                elif err.errno == errorcode.ER_BAD_DB_ERROR:
                    print("DATABASE Does Not Exist")
                else:
                    print(err)

        if len(self.FailedLocationList)!=0:
            self.WriteFailedLocations()
        return [self.DataFramesStack,[self.c1,self.c2,self.c3],self.FailedLocationList]
    
    def WriteFailedLocations(self):
        self.file = open(self.Filename+'/FailedLocations.txt','w')
        for ip in self.FailedLocationList:
            self.file.write('{}\n'.format(ip))
        self.file.close()
            

    def IterativeOrNotRun(self):
        if self.IterativeOrNot == True:
            while len(self.IPLists) != 0:
                return(self.SqlConnector())
        elif self.IterativeOrNot == False:
            return(self.SqlConnector())
            




def SaveToExcel(query,filename,choices,fileExtension,iterativeornot):

    testobj = MySQLImporter(query,filename,choices,fileExtension,iterativeornot)
    queryDatas = testobj.IterativeOrNotRun()
    export = dfConcat(queryDatas[0])
    Folder = filename+'/'+filename
    FolderCreate(Folder)
  
    ListEmptyOrNot(Folder,fileExtension,filename,export)
    print("******** SAVING SUCCESSFULL ********")
    QueryToFilesaver(Folder,query)
  


SaveToExcel(query,'filename',['loctype1','loctype2'],'xls',True)
4
  • 1
    Can you be more specific than "code doesn't work"? Commented Jul 8, 2022 at 15:22
  • 1
    I think you have a return inside your while, this will end the method IterativeOrNotRun Commented Jul 8, 2022 at 15:26
  • if i pass True for the self.IterativeOrNot' the while len(self.IPLists)!=0` doesn't work just the for loop will iter and the SqlConnector will finished. the while loop is not working until the self.IPLists is 0 Commented Jul 8, 2022 at 15:27
  • 1
    this is supposed to run while you have some ips in the list, but, the return inside the while will cut at first iteration because the return end the function. What are you expecting as output of the function IterativeOrNotRun ? Commented Jul 8, 2022 at 15:30

1 Answer 1

1

You have a return inside the while, so when the execution reaches that line it exits immediately. If your goal is that the code resumes at the last point of the list it left last time you need to think in using a generator (and yeild instead of return a connection), but you sure need to rethink your strategy on this.

Sign up to request clarification or add additional context in comments.

1 Comment

this works i didn't get the using generator

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.