私が持っているすべては `Connection`オブジェクトであるときにはどうすれば適切な` paramstyle`を決定するのですか?
-
16-09-2019 - |
質問
私は(DBのAPI 2.0に準拠するために必要な)Connection
のインスタンスを持っている、私はそれがインポートされたモジュールを持っていません。問題は、私は名前付きパラメータを使用しようとしていますが、私は使用するparamstyle
か分からないということです。
paramstyle
は、モジュールレベルの定数であるので、、私はちょうどConnection
を求めることはできません。私は私のinspect.getmodule()
インスタンス上で Connection
に使用してみましたが、それはただNone
を返さ。私はちょうど欠けている簡単な方法はありますか、私が使用するtry
を決定するためにいくつかのexcept
/ paramstyle
コードを実行する必要があります?
解決
パスtype(connection)
(接続クラス)接続オブジェクトではなく、inspect.getmodule()
します。オブジェクトの作成が追跡されていない状態クラスは、そうinspect
がそれを見つけることができるで定義されたモジュールを追跡します。
他のヒント
どこからインスタンスを取得しましたか?私はあなたが事前に接続のソースを知らないだろう状況を想像することはできません。あなたのライブラリーのユーザーがあなたに接続を渡している場合は、同様paramstyleのために彼を尋ねます。
とにかく、次のコンソールセッションを見てみます:
>>> import sqlite3
>>> c = sqlite3.connect('/tmp/test.db')
>>> c
<sqlite3.Connection object at 0xb7db2320>
>>> type(c)
<type 'sqlite3.Connection'>
>>> type(c).__module__
'sqlite3'
>>> import sys
>>> sys.modules[type(c).__module__].paramstyle
'qmark'
しかしそれは吸います。私がいなくても第二のためにそれに依存しないでしょう。私は自分のコネクションのようなオブジェクトを使用して、私はあなたのライブラリーにそれらのいずれかを渡したいと思います。私は、接続のようなラッパーオブジェクトを使用していますので、それは魔法のparamstyleを見つけるためにしようとすると失敗したとき、私はそれを憎むます。
あなたがすることはできません。
あなたはconnection.__class__.__module__
を見ることで試すことができますが、それは、それがうまくいくDB-APIによって指定されていません。多くの一般的なケースで、実際にそれではないでしょう。 (例えば、クラスは、DB-APIモジュールオブジェクトとして機能パッケージのサブモジュールで定義されている、またはクラスがない__module__
とCの拡張である。)
それは残念ですが、あなたはDB-API接続オブジェクトの周りDB-APIモジュールオブジェクトへの参照を渡す必要があります。