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)、integer和timestamp,则返回的对象将类似于:
{'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。
- 日期、时间和时间戳被映射到datetime64和 timedelta 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()都得到了提高。