iopro.pyodbc

该项目是对 ODBC 的 Python 数据库模块的增强,它实现了 Python DB API 2.0 规范。您可以在此处查看原始项目:

主页:http://code.google.com/p/pyodbc
来源:http://github.com/mkleehammer/pyodbc
来源:http://code.google.com/p/pyodbc/source/list

增强功能记录在此文件中。有关 pyodbc 包的一般信息,请参阅原始项目文档。

此模块增强需要:

  • Python 2.4 或更高版本
  • ODBC 3.0 或更高版本
  • NumPy 1.5 或更高版本(datetime64 支持需要 1.7)

该模块中的增强主要包括添加一些新方法,用于在查询后获取数据并将其放入各种 NumPy 容器中。

使用 NumPy 作为数据容器而不是经典的元组列表有两个优点:

1) NumPy 容器要紧凑得多,因此与原始方法相比,它需要的内存少得多。

2) 由于 NumPy 容器可以容纳任意大的数组,因此与原始方法(检索的每个数据一个 Python 对象)相比,它需要的对象创建要少得多。

这意味着此增强功能将允许以更快的方式从关系数据库中提取数据,同时消耗更少的资源。

API 添加

变量

  • pyodbc.npversion NumPy 添加的版本

方法

Cursor.fetchdictarray (size=cursor.arraysize)

这类似于原始的Cursor.fetchmany(size),但数据在字典中返回,其中键是列的名称,值是 NumPy 容器。

例如,如果 SELECT 返回名称为 'a'、'b' 和 'c' 的 3 列,类型为varchar(10)integertimestamp,则返回的对象将类似于:

{'a': array([...], dtype='S11'),
 'b': array([...], dtype=int32),
 'c': array([...], dtype=datetime64[us])}

请注意,varchar(10)类型会自动转换为包含 11 个元素的字符串类型 ('S11')。这是因为 ODBC 驱动程序需要一个额外的空间来将尾随的“0”放在字符串中,而 NumPy 需要为此提供空间。

此外,重要的是要强调所有时间戳类型默认转换为分辨率为微秒的 NumPy datetime64类型。

Cursor.fetchsarray (size=cursor.arraysize)

这类似于原始的Cursor.fetchmany(size),但数据在 NumPy 结构化数组中返回,其中字段的名称和类型与 SELECT 产生的字段匹配。

这是上面 SELECT 的输出示例:

array([(...),
       (...)],
      dtype=[('a', '|S11'), ('b', '<i4'), ('c', ('<M8[us]', {}))])

请注意,出于效率考虑,此方法在后台调用 fetchdictarray(),然后进行转换以获取结构化数组。所以,一般来说,这比它的fetchdictarray()对应物要慢一些。

支持的数据类型

上面列出的新方法支持标准 ODBC 的一个子集。特别是:

  • 支持字符串 (SQL_VARCHAR)。
  • 完全支持数字类型,无论是整数还是浮点数(单精度和双精度)。这是完整的列表:SQL_INTEGER、SQL_TINYINT、SQL_SMALLINT、SQL_FLOAT 和 SQL_DOUBLE。
  • 日期、时间和时间戳被映射到datetime64timedelta NumPy 类型。支持的数据类型列表是:SQL_DATE、SQL_TIME 和 SQL_TIMESTAMP,
  • 尚不支持二进制数据。
  • 尚不支持 Unicode 字符串。

空值

由于(尚未)在 NumPy 中明确支持缺失值 (NA),因此该模块根据数据类型将 NA 数据表示为特定值。这是特定值的当前表:

int8: -128 (-2**7)
uint8: 255 (2**8-1)
int16: -32768 (-2**15)
uint16: 65535 (2**16-1)
int32: -2147483648 (-2**31)
uint32: 4294967295 (2**32-1)
int64: -9223372036854775808 (-2**63)
uint64: 18446744073709551615 (2**64-1)
float32: NaN
float64: NaN
datetime64: NaT
timedelta64: NaT (or -2**63)
string: 'NA'

1.1 版本的改进

  • fetchdict()fetchsarray()方法不再信任 rowcount 。现在 NumPy 容器是增量构建的,使用 realloc 更好地利用资源。
  • 当获取 NumPy 不支持的外来数据类型时,Python 解释器不再退出。
  • 对于docsctrings fetchdict()fetchsarray()都得到了提高。