2015-03-10 4 views
1

Я извлекаю данные из базы данных и извлекаю их из этого метода.«KeyError: 0» при чтении взятой строки

def _db_execute(s, query, data=None, return_data=False): 

     con = mdb.connect(s.sql_detail['host'], s.sql_detail['user'], s.sql_detail['pass'], s.sql_detail['db'], cursorclass=mdb.cursors.DictCursor) 
     with con: 
      cur = con.cursor() 
      if type(data) in [ list, tuple ] and len(data) != 0: 
       if data[0] in [ list, tuple ]: 
        cur.executemany(query, (item for item in data)) 
       else: 
        cur.execute(query, data) 
      elif data != None: 
       cur.execute(query, [data]) 
      else: 
       cur.execute(query) 
      if return_data: 
       data = cur.fetchall() 
       if len(data) == 0: 
        data = None 
       return data 

Следующий способ получения данных.

def retrieve_portal_credetials(self): 

     if(self.valid_user()): 

      query2 ='''SELECT `group`,`username`,`password` FROM db.users u, db.groups g, db.user_groups i where u.userid=i.user_id and g.group_id = i.groupd_id and u.username=%s''' 

      portal_data= self._db_execute(query=query2, data = self.username, return_data = True) 

     return portal_data 

Я пытаюсь присвоить данные переменных здесь

rows = auth_usr.retrieve_portal_credetials() 



           #list_of_portaldata = list(portal_data) 
           #s.data.update({'groups_list': [val]}) 
           #val= list_of_portaldata 

           for row in rows: 


            portal_group = row[0] 
            portal_username = row[1] 
            portal_password = row[2]         

Когда я отладки через код, я нашел, что это ломает здесь portal_group = row[0] и я получил ошибку KeyError: 0

Что я понял, был , строка не имеет ключа 0. Вот почему я получаю эту ошибку. Однако в отладчике он отображает 3 переменные под строкой. Может ли кто-нибудь дать какой-либо намек на это?

+0

'hasattr (объект, '__ ИТЭР __')' или 'isinstance (е, collections.Iterable)' канонический способ проверить Iterable (http://stackoverflow.com/questions/1952464/in- python-how-do-i-define-if-an-object-is-iterable) –

+0

Является ли 'row' похожим на словарь объектом или подобным списком объектом? Тот факт, что вы получаете 'KeyError', а не' IndexError', говорит о том, что это dict-like ... –

ответ

0

После проверки структуры данных отображается в отладчике.

Я использую следующий синтаксис для доступа к данным.

portal_group = row['group'] 
portal_username = row['username'] 
portal_password = row['password']