2013-09-17 4 views
0

Это мой первый пост здесь, и я нашел так много ответов здесь, я действительно уверен, что некоторые могут мне помочь. Поскольку я работаю с Python всего около полугода, возможно, это очень глупый вопрос начинающих. Простите меня до сих пор ...Pymysql cur.fetchall() возвращает None

В моем проекте у меня есть несколько различных функций. Два из них перечислены ниже. mysqlLogbookIndex - это шоу с ведьмой, обновляющее список с именами некоторой таблицы из базы данных. В настоящее время соединение с БД существует, функция вызывается и до сих пор работает нормально. В конце я вижу кортеж, содержащий все имена таблиц.

Но теперь идет вторая функция, названная create_flight. Это обратный вызов для кнопки Tkinter и создания некоторых новых таблиц в моей базе данных. Он использует то же самое предварительно подключенное соединение, что и mysqlLogbookIndex.

Я ожидал увидеть новые таблицы мой кортеж в следующем цикле mysqlLogbookIndex но что случилось, что результат превратился в None.

Знаете ли вы, почему?

Widget функция:

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 

Заранее спасибо за все полезные посты ...

+0

До сих пор я проспал ночь о проблеме и решил изменить вызовы функций, чтобы проблема не возникала. Но если у кого-то есть ответ, я все еще доволен ... – FlorianM

ответ

0

Нашли ошибку более или менее. Кажется, это проблема MySQL.

В моей первоначальной идее я подключился к БД «hcm» и попытался получить информацию о таблице из базы данных «information_schema». Если «hcm» был изменен, запрос вернул None.

Я установил второе независимое соединение MySQL в моей функции для цикла обновления и напрямую подключился к «information_schema».