2011-11-09 9 views
12

私は、PythonのSQLiteインターフェイスにSQLデータベースを扱うために慣れていますか? PythonのSQLiteのAPIの優れた機能の1つは、「コンテキストマネージャ」です。つまり、Pythonのwithステートメントです。私のクエリがデータベースを変更し、私はconn.commit()を実行するのを忘れた場合、コンテキストマネージャはwith文を出る際に、自動的に私のためにそれを実行し、上記のコードでPythonのMySQLdb用のコンテキストマネージャ

import as sqlite 

with sqlite.connect(db_filename) as conn: 
    query = "INSERT OR IGNORE INTO shapes VALUES (?,?);" 
    results = conn.execute(query, ("ID1","triangle")) 

:私は通常、次のようにクエリを実行します。また、例外をうまく処理します。何かをコミットする前に例外が発生した場合、データベースはロールバックされます。

私は現在MySQLdbインターフェイスを使用しています。これは、類似のコンテキストマネージャをそのままサポートしていないようです。自分自身を作成するにはどうすればいいですか?関連する質問hereがありますが、完全な解決策はありません。

答えて

15

MySQLdb接続がコンテキストマネージャになっていることに注意してください。 user2966041's answerを参照してください。


あなたはこのようなものを使用できます:あなたはあなたのPYTHONPATHにconfig.pyを置き、そこHOST、USER、PASS、MYDB変数を定義し、それを使用するには

import config 
import MySQLdb 
import MySQLdb.cursors as mc 
import _mysql_exceptions 
DictCursor = mc.DictCursor 
SSCursor = mc.SSCursor 
SSDictCursor = mc.SSDictCursor 
Cursor = mc.Cursor 


class Cursor(object): 
    def __init__(self, 
       cursorclass=Cursor, 
       host=config.HOST, user=config.USER, 
       passwd=config.PASS, dbname=config.MYDB, 
       driver=MySQLdb, 
       ): 
     self.cursorclass = cursorclass 
     self.host = host 
     self.user = user 
     self.passwd = passwd 
     self.dbname = dbname 
     self.driver = driver 
     self.connection = self.driver.connect(
      host=host, user=user, passwd=passwd, db=dbname, 
      cursorclass=cursorclass) 
     self.cursor = self.connection.cursor() 

    def __iter__(self): 
     for item in self.cursor: 
      yield item 

    def __enter__(self): 
     return self.cursor 

    def __exit__(self, ext_type, exc_value, traceback): 
     self.cursor.close() 
     if isinstance(exc_value, Exception): 
      self.connection.rollback() 
     else: 
      self.connection.commit() 
     self.connection.close() 

with Cursor() as cursor: 
    print(cursor) 
    connection = (cursor.connection) 
    print(connection) 

を。あなたが代わりにoursql使用して検討する必要があります

with some_connection as cursor: 
    do_something_with(cursor) 

ということにも注意してくださいoursqlを内蔵 with構造が付属してMySQL用の代替ドライバーです。

+0

優れたソリューション!あなたはMySQLdbの答えを出しただけでなく、他のドライバと一緒に使うこともできます。また、oursqlは有望です。ありがとう。 – conradlee

+0

@MMartins:ありがとうございました。 – unutbu

17

この質問は最初に尋ねられて以来、変更されていると思われます。多少混乱している(少なくとも私の見地から)、最新のバージョンのMySQLdbでは、コンテキスト内で接続を使用すると、カーソルが(oursqlの例で)表示され、自動的に閉じないものは表示されません例えばファイル)。

は、ここで私は何をすべきかです:

from contextlib import closing 
with closing(getConnection()) as conn: #ensure that the connection is closed 
    with conn as cursor:    #cursor will now auto-commit 
     cursor.execute('SELECT * FROM tablename') 
+0

自動コミット?オートコミットモードのように、トランザクションはありませんか? – Halfgaar

関連する問題