如何仅凭 `Connection` 对象确定合适的 `paramstyle`?

2 投票
3 回答
836 浏览
提问于 2025-04-15 14:34

我有一个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 就能找到它,而对象的创建过程是不会被记录的。

撰写回答