cursor.description "type_code" 与数据库字段类型的对应关系

mik*_*ent 5 python mysql database connection

使用MySQL后端,基本上想从cursor.description元组中的type_code确定表的字段类型...

我得到的是一堆不同的数字...通过将我的表与 type_code 值进行比较,我可以手动组合一组对应关系...但是我的类型比我的 Python 书中记录的类型对象多得多(Beazley ),即 STRING、BINARY、NUMBER、DATETIME、ROWID。

我认为因此有不同的 type_codes 被赋予诸如 DECIMAL、UNSIGNED INT 等之类的东西......但我只是惊讶地无法在这里或在网上找到任何信息。

顺便说一句,我想做的是自动化这个过程,通过输入(例如连接到 MySQL 表的 GUI 网格中)确定表期望该列的数据类型,并解析和检查它以找到确定这是否是合法值。

bob*_*nce 3

您书中描述的基本类型代码是由DB-API 规范定义的。

type_code 必须等于下面定义的类型对象之一。

这里的技巧是,可以有多个不同的类型代码,所有这些代码都等于相同类型的对象。

>>> MySQLdb.constants.FIELD_TYPE.TIMESTAMP
7
>>> MySQLdb.constants.FIELD_TYPE.DATETIME
12
>>> MySQLdb.constants.FIELD_TYPE.TIMESTAMP==MySQLdb.DATETIME
True
>>> MySQLdb.constants.FIELD_TYPE.DATETIME==MySQLdb.DATETIME
True
>>> MySQLdb.DATETIME
DBAPISet([12, 7])
Run Code Online (Sandbox Code Playgroud)

(DB-API 规范中关于 DBAPITypeObject 的注释概述了如何实现这种魔法。更传统的接口可能已经通过子类来完成此操作......)

这使得 MySQLdb 能够提供有关该列的更丰富的信息,而不仅仅是它是否是日期和时间类型,同时仍然允许对字符串与数字进行简单的测试。

当然,如果您开始直接与 MySQLdb.constants.FIELD_TYPE 类型进行比较,您将依赖于无法移植到其他数据库的 MySQLdb 功能。