さまざまなデータベース エンジンに実装できるデータベース スキーマがあります (たとえば、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 を一般的にキャッチするにはどうすればよいですか?