如何仅凭 `Connection` 对象确定合适的 `paramstyle`?
我有一个Connection
的实例(这是符合DB API 2.0标准的),但是我不知道它是从哪个模块导入的。现在的问题是,我想使用命名参数,但我不知道该用哪个paramstyle
。
因为paramstyle
是一个模块级的常量,所以我不能直接问Connection
。我试着在我的Connection
实例上使用inspect.getmodule()
,但它返回的结果是None
。有没有更简单的方法我没想到,还是说我需要写一些try
/except
代码来确定该用哪个paramstyle
呢?
3 个回答
2
你不能这样做。
你可以试着查看 connection.__class__.__module__
,但DB-API并没有明确说明这样做一定有效。实际上,在很多常见的情况下,这样做是行不通的。比如,类可能是在作为DB-API模块对象的包的子模块中定义的;或者这个类是一个没有 __module__
的C扩展。
这确实有点遗憾,但你需要在使用DB-API连接对象时,传递一个对DB-API模块对象的引用。
2
你是从哪里得到这个实例的?我想不出有什么情况会让你事先不知道连接的来源。如果你的库的用户给你传递了一个连接,那就让他们也告诉你参数样式。
无论如何,看看下面这个控制台会话:
>>> 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'
不过这真让人失望。我连一秒钟都不想依赖它。我使用我自己的一些连接类对象,我想把其中一个传给你的库。如果它试图神奇地找出参数样式,但因为我使用的是一个连接类的包装对象而失败,那我可真不想看到这种情况。
2
把 type(connection)
(连接的类)传给 inspect.getmodule()
,而不是直接传连接对象。因为类会记录它被定义在哪个模块里,这样 inspect
就能找到它,而对象的创建过程是不会被记录的。