代码之家  ›  专栏  ›  技术社区  ›  Hank Gay

当我只有一个“connection”对象时,如何确定正确的“paramstyle”?

  •  2
  • Hank Gay  · 技术社区  · 16 年前

    我有一个 Connection (需要符合DBAPI 2.0),但我没有从中导入它的模块。问题是我正在尝试使用命名参数,但我不知道是哪个参数 paramstyle 使用。

    自从 参数样式 是模块级常量,我不能只问 连接 . 我试着用 inspect.getmodule() 在我身上 连接 实例,但它刚返回 None . 有没有更简单的方法,我只是失踪了,还是我需要做一些 try / except 代码以确定 参数样式 使用?

    3 回复  |  直到 9 年前
        1
  •  2
  •   Denis Otkidach    16 年前

    通过 type(connection) (连接类)到 inspect.getmodule() ,不是连接对象。类跟踪在so中定义的模块 inspect 在不跟踪对象创建的情况下,可以找到它。

        2
  •  2
  •   nosklo    16 年前

    你从哪里得到这个实例的?我无法想象,在这种情况下,你会事先不知道连接的来源。如果库的用户向您传递了一个连接,请向他索要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并失败时,我会讨厌它,因为我使用的是类似于包装器对象的连接。

        3
  •  2
  •   bobince    16 年前

    你不能。

    你可以试试看 connection.__class__.__module__ 但是DB-API没有指定它可以工作。事实上,在许多常见情况下,它不会这样做(例如,类是在充当db-api模块对象的包的子模块中定义的;或者类是不带 __module__ )

    不幸的是,您必须使用db-api连接对象传递对db-api模块对象的引用。

    推荐文章