2017-01-19 5 views
0

データベースのsqlite3の: Pythonの私は以下の私のコードで小さなプログラムを持っ

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!') 

コードは、プログラムは次のエラー

になります:、Cなど)db.cursor(とラインに到達

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

どうしますか?

+0

カーソルはコンテキストマネージャをサポートしていません。あなたはそれで 'with'を使うことはできません。 –

答えて

1

この場合、withステートメント(db.cursor())に渡される式は、コンテキストマネージャオブジェクトを返す必要があります。コンテキストマネージャオブジェクトは__enter____exit__の両方のメソッドを持つ必要があります(withステートメントはこれらのメソッドを使用して、オブジェクトが正しくクリーンアップされるようにします)。

sqlite3カーソルオブジェクトはこれらのメソッドを実装していないため、有効なコンテキストマネージャメソッドではありません。したがって、取得しているエラーメッセージです。

カーソルの周りに独自のコンテキストマネージャーを書くことができます。あなたは自分で書くことができますが、ほとんどの場合、これは必要ではありません.dbにdb.cursor()を直接割り当てるだけです。

c = db.cursor() 
関連する問題