Question

This is my first post here and I found so many answers here I am really confident, that some can help me. Because I work with Python for only about half a year now, it maybe is a very stupid beginners question. Forgive me so far...

In my project I have several different functions. Two of them are listed below. mysqlLogbookIndex is a thread witch show refresh a list with the names of some table from a database. The connection to the DB is existing at the moment, the function is called and so far it works fine. At the end I can see a tuple containing all the table names.

But now the second function, named create_flight comes in. It is a callback for a Tkinter button and creates some new tables in my database. It uses the same preopened connection than mysqlLogbookIndex.

I expected to see the new tables is my tuple in the next cycle of mysqlLogbookIndex but what happened is that result turned into a None.

Do you know why?

Widget function:

def create_flight(self):
# *********************************************************************************************
# * Create new flight table                                                                   *
# *********************************************************************************************
if self.sql_write.get():
    # ********************************************
    # * Try to connect message                   *
    # ********************************************
    self.printLog(self.lbl_sql_write, self.LANG['tryCreateTable'], 'normal')
    logging.info('Creating table for flight tracking...')


    # ********************************************
    # * Create name tables                       *
    # ********************************************
    event = self.oprSett['mysql']['event']
    now = str(int(time.time()))
    mainName = "tbl_%s_%s_" % (event, now)

    trackingTable = mainName + "flighttrack"
    logging.debug('Name of tracking table: %s', trackingTable)

    unitsTable = mainName + "units"
    logging.debug('Name of units table: %s', unitsTable)

    headerTable = mainName + "header"
    logging.debug('Name of header table: %s', headerTable)


    # ********************************************
    # * Read SQL parameter                       *
    # ********************************************
    logging.debug('Reading CSV file for table structure...')
    csvFile = "config/newFlight.csv"
    try:
        sqlCsv = csv.reader(open(csvFile, 'rb'),
                            delimiter = ',',
                            quotechar = '"',
                            quoting = csv.QUOTE_ALL
                           )
    except:
        msg = csvFile
        msg += "\n\n"
        msg += self.LANG['e13']
        tkMessageBox.showerror("Error 13", msg)
        self.printLog(self.lbl_sql_write, self.LANG['e13'], 'error')
        logging.error('File not found!')
        #print "[Error 13] " + self.LANG['e13']
        return 0

    # Transfer data from CSV file into own list
    sqlVars = []
    for row in sqlCsv:
        if len(row) == 4 and row[0][0] != "#": # No comment
            sqlVars.append(row)


    # *************************************************
    # * Create SQL statement to create tracking table *
    # *************************************************

    # Head for creating new table
    sql = "CREATE TABLE IF NOT EXISTS `%s` (\n" % trackingTable
    sql += "  `ID` int(11) NOT NULL AUTO_INCREMENT,\n" # Becomes primary key

    # Parse SQL variables from CSV file
    for row in sqlVars:
        if len(row[2]) > 0:                # Data type requires length
            sql += "  `%s` %s(%s) NOT NULL COMMENT '%s',\n" % (row[0], row[1], row[2], row[3])
        else:                              # Data type not requires length
            sql += "  `%s` %s NOT NULL COMMENT '%s',\n" % (row[0], row[1], row[3])

    # Footer of SQL statement for creating new table
    sql += "  PRIMARY KEY (`ID`)\n"
    sql += ") ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=0;\n"
    sql += "\n"

    # In debug mode print SQL statement to console
    #logging.debug('SQL statement to create tracking table:\n%s', sql)


    # **********************************************
    # * Create SQL statement to create units table *
    # **********************************************

    # Head for creating new table
    sql += "CREATE TABLE IF NOT EXISTS `%s` (\n" % unitsTable
    sql += "  `ID` int(11) NOT NULL AUTO_INCREMENT,\n"                # Becomes primary key
    sql += "  `Dataref` varchar(10) COLLATE latin1_german1_ci NOT NULL,\n"
    sql += "  `Unit` varchar(10) COLLATE latin1_german1_ci NOT NULL,\n"
    sql += "  PRIMARY KEY (`ID`)\n"
    sql += ") ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=1 ;\n"
    sql += "\n"

    # Parse SQL variables from CSV file
    for row in sqlVars:
        # Insert units in tbl_units
        sql += "INSERT INTO %s VALUES ('', '%s', '%s');\n" % (unitsTable, row[0], row[3])
    sql += "\n"

    # In debug mode print SQL statement to console
    #logging.debug('SQL statement to create units table:\n%s', sql)


    # ***********************************************
    # * Create SQL statement to create header table *
    # ***********************************************

    # Head for creating new table
    sql += "CREATE TABLE IF NOT EXISTS `%s` (\n" % headerTable
    #sql += "  `ID` int(11) NOT NULL AUTO_INCREMENT,\n"                # Becomes primary key
    sql += "  `Parameter` char(21) COLLATE latin1_german1_ci NOT NULL,\n"
    sql += "  `Value` varchar(100) COLLATE latin1_german1_ci NOT NULL,\n"
    sql += "  PRIMARY KEY (`Parameter`)\n"
    sql += ") ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=1 ;\n"
    sql += "\n"

    # IGC syntax from: http://carrier.csi.cam.ac.uk/forsterlewis/soaring/igc_file_format/igc_format_2008.html

    # Adding header parameters, some values are coming later
    sql += "INSERT INTO %s VALUES ('AXXX001', '');\n"                        % (headerTable)                     # Manufacturer code
    sql += "INSERT INTO %s VALUES ('HFFXA', '035');\n"                       % (headerTable)                     # Fix accuracy
    sql += "INSERT INTO %s VALUES ('HFDTE', '');\n"                          % (headerTable)                     # UTC date of flight
    sql += "INSERT INTO %s VALUES ('HFPLTPILOT', '');\n"                     % (headerTable)                     # Pilots name
    sql += "INSERT INTO %s VALUES ('HFGTYGLIDERTYPE', 'KA8B');\n"            % (headerTable)                     # Glider type
    sql += "INSERT INTO %s VALUES ('HFGIDGLIDERID', 'D1389');\n"             % (headerTable)                     # Glider callsign
    sql += "INSERT INTO %s VALUES ('HFDTM100DATUM', 'WGS-1984');\n"          % (headerTable)                     # GPS datum
    sql += "INSERT INTO %s VALUES ('HFGPSGPS', 'X-PLANE 10');\n"             % (headerTable)                     # Manufacturer of GPS module
    sql += "INSERT INTO %s VALUES ('HFFTYFRTYPE', 'FLORIANMEISSNER,HCM');\n" % (headerTable)                     # Logger type
    sql += "INSERT INTO %s VALUES ('HFRFWFIRMWAREVERSION', '%s');\n"         % (headerTable, self.VERSION)       # Firmware version
    sql += "INSERT INTO %s VALUES ('HFRHWHARDWAREVERSION', '%s');\n"         % (headerTable, self.XPLANEVERSION) # Hardware version
    sql += "INSERT INTO %s VALUES ('HFCCLCOMPETITIONCLASS', 'CLUB');\n"      % (headerTable)                     # Competition class


    # ********************************************
    # * Handover SQL statement to create table   *
    # * to DB.                                   *
    # ********************************************
    logging.debug('SQL statement to create all tables:\n%s', sql)
    try:
        cur = self.conn.cursor()
        cur.execute(sql)
        cur.close()
    except pymysql.Error, e:
        tkMessageBox.showerror("Error 9", self.LANG['e9'])
        self.printLog(self.lbl_sql_write, self.LANG['e9'], 'error')
        #print "[Error 9] " + self.LANG['e9']
        logging.error('Could not create tracking table!')
        logging.debug(e)
        return 0

    # ********************************************
    # * Print success message                    *
    # ********************************************
    logging.info('Tracking table created.')
    self.printLog(self.lbl_sql_write, self.LANG['doneCreateTable'], 'success')
    text = self.LANG['flightId'] + " " +  trackingTable
    self.printLog(self.lbl_sql_write, text, 'normal', timestamp=False)

    # Make trackingTable public
    self.tableName = trackingTable

    # Enable tambour register to write in database
    self.tambourInMysql = True

Refresh Loop:

def mysqlLogbookIndex(self):

delay = float(self.oprSett['logbook']['refresh_delay']) / 1000

# ********************************************************************
# * Run only if MySQL connection from writeMysql.py is active        *
# ********************************************************************
while self.sql_write.get():

    # ********************************************
    # * Query to get list with tables            *
    # ********************************************
    logging.info('Querying list with tables from database')
    dbName = self.oprSett['mysql']['db']

    sql = "SELECT TABLE_NAME\n"
    sql += "FROM `information_schema`.`TABLES`\n"
    sql += "WHERE `TABLE_SCHEMA` LIKE '%s'" % dbName

    try:
        cur = self.conn.cursor()
        cur.execute(sql)
        result = cur.fetchall()
        cur.close()
    except pymysql.Error, e:
        logging.warning('Could not take flights from database!')
        logging.debug(e)
        self.printLog(self.lbl_sql_write, self.LANG['e20'], 'error')
        #continue
    else:
        logging.info('Logbook refreshed.')

        print result

Thanks in advance for all helpful posts...

Was it helpful?

Solution

Found the error more or less. It seems to be a MySQL issue.

In my original idea I connected to DB "hcm" and tried to get some table informations from "information_schema" DB. If the "hcm" was changed the query returned None.

Solution: I established a second independent MySQL connection in my function for the refresh loop and connected to "information_schema" directly.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top