3

さまざまなデータベース エンジンに実装できるデータベース スキーマがあります (たとえば、pyodbc を使用して接続する MS Access データベースや、組み込みの sqlite3 モジュールを介して接続する SQLite データベースを考えてみましょう)。簡単な例)。

次のようなパラメータに基づいて適切なタイプのデータベース接続を返すファクトリ関数/メソッドを作成したいと思います。

def createConnection(connType, params):
    if connType == 'sqlite':
        return sqlite3.connect(params['filename'])
    elif connType == 'msaccess':
        return pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ={};'.format(params['filename']))
    else:
        # do something else

これで、任意の接続タイプで動作するはずのクエリ コードがいくつかあります (スキーマは基礎となる DB エンジンに関係なく同一であるため) が、キャッチする必要がある例外をスローする可能性があります。

db = createDatabase(params['dbType'], params)

cursor = db.cursor()

try:
    cursor.execute('SELECT A, B, C FROM TABLE')
    for row in cursor:
        print('{},{},{}'.format(row.A, row.B, row.C))

except DatabaseError as err:
    # Do something...

私が抱えている問題は、各 DB API 2.0 実装の DatabaseError クラスが共通の基本クラス (一般的すぎる例外を除く) を共有していないため、これらの例外を一般的にキャッチする方法がわからないことです。明らかに、次のようなことができます。

try:
    # as before
except sqlite3.DatabaseError as err:
    # do something
except pyodbc.DatabaseError as err:
    # do something again

...ここでは、考えられるデータベース エンジンごとに明示的な catch ブロックを含めました。しかし、これは明らかにPythonicではないようです。

基礎となるさまざまな DB API 2.0 データベース実装から DatabaseErrors を一般的にキャッチするにはどうすればよいですか?

4

1 に答える 1