私が持っているすべては `Connection`オブジェクトであるときにはどうすれば適切な` paramstyle`を決定するのですか?

StackOverflow https://stackoverflow.com/questions/1471304

  •  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モジュールオブジェクトへの参照を渡す必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top