2017-01-19 6 views
0

Я получил небольшую программу с моим кодом ниже:Python sqlite3 базы данных

def get_code(hex_pattern, database='./AndroidLockScreenRainbow.sqlite'): 
    try: 
     if os.path.exists(database): 
      with lite.connect(database) as db: 
       with db.cursor() as c: 
        c.execute("SELECT * FROM RainbowTable") 
        rows = c.fetchall() 
        for row in rows: 
         if row[0] == hex_pattern: 
          return row[1] 
     else: 
      raise lite.OperationalError("Database file not exists") 
    except lite.OperationalError: 
     print('Given SQL table not found!') 

Когда код достигают линии с db.cursor() в C :, программа выдает следующую ошибку

with db.cursor() as c: 
AttributeError: __exit__ 

Что я не так?

+0

Курсор не поддерживает диспетчер контекста. Вы не можете использовать 'with' с ним. –

ответ

1

Выражение, переданное в оператор with (db.cursor()), в этом случае должно возвращать объект-менеджер контекста. Объект менеджера контекста должен иметь как метод , так и __exit__ (под капотом оператор with использует эти методы для обеспечения правильной очистки объекта).

Объект-указатель sqlite3 не реализует эти методы, поэтому он не является допустимым методом диспетчера контекста, поэтому появляется сообщение об ошибке, которое вы получаете.

Вы можете написать свой собственный менеджер контекстов вокруг курсора. Вы можете написать их самостоятельно, но в большинстве случаев это необязательно, просто назначьте db.cursor() в db напрямую

c = db.cursor() 
Смежные вопросы