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

时间:2011-10-18 20:40:14

标签: python mysql database connection

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

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

我认为因此给DECIMAL,UNSIGNED INT等等提供了不同的type_codes ...但我很惊讶不能在这里或网上找到任何信息。

顺便说一下,我想要做的是自动化进程,在该过程中,输入(例如,在连接到MySQL表的GUI网格中)确定表对该列期望的数据类型,并进行解析和检查它是为了确定这是否合法。

3 个答案:

答案 0 :(得分:3)

书中描述的基本类型代码由DB-API specification定义。

  

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

这里的技巧是可以存在多个不同的类型代码,它们都比较相同的类型对象。

>>> 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])

(在DB-API规范中有关DBAPITypeObject的说明中概述了如何实现这种魔法。更传统的接口可能已经通过子类完成了这一点......)

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

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

答案 1 :(得分:2)

如果您使用MySQLdb,则MySQLdb.constants.FIELD_TYPE模块包含每种字段类型的常量。

>>> print dir(MySQLdb.constants.FIELD_TYPE)
['BIT', 'BLOB', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'DOUBLE', 'ENUM', 
 'FLOAT', 'GEOMETRY', 'INT24', 'INTERVAL', 'LONG', 'LONGLONG', 'LONG_BLOB', 
 'MEDIUM_BLOB', 'NEWDATE', 'NEWDECIMAL', 'NULL', 'SET', 'SHORT', 'STRING', 
 'TIME', 'TIMESTAMP', 'TINY', 'TINY_BLOB', 'VARCHAR', 'VAR_STRING', 'YEAR',
 '__builtins__', '__doc__', '__file__', '__name__', '__package__']

例如,5的类型代码表示它是MySQL双重

>>> MySQLdb.constants.FIELD_TYPE.DOUBLE 
5

此模块在documentation

中注明

答案 2 :(得分:1)

如果您有兴趣获取有关ids如何映射到描述的字典:

>>> ft = MySQLdb.constants.FIELD_TYPE
>>> d = {getattr(ft, k): k for k in dir(ft) if not k.startswith('_')}
>>> d
{0: 'DECIMAL',
 1: 'TINY',
 2: 'SHORT',
 3: 'LONG',
 4: 'FLOAT',
 5: 'DOUBLE',
 6: 'NULL',
 7: 'TIMESTAMP',
 8: 'LONGLONG',
 9: 'INT24',
 10: 'DATE',
 11: 'TIME',
 12: 'DATETIME',
 13: 'YEAR',
 14: 'NEWDATE',
 15: 'VARCHAR',
 16: 'BIT',
 246: 'NEWDECIMAL',
 247: 'INTERVAL',
 248: 'SET',
 249: 'TINY_BLOB',
 250: 'MEDIUM_BLOB',
 251: 'LONG_BLOB',
 252: 'BLOB',
 253: 'VAR_STRING',
 254: 'STRING',
 255: 'GEOMETRY'}