使用MySQL后端,基本上想要从cursor.description元组中的type_code确定表的字段类型......
我得到的是一堆不同的数字......通过将我的表与type_code值进行比较,我可以手动将一组对应关系放在一起......但是我有比Python中记录的类型对象更多的类型书(Beazley),即STRING,BINARY,NUMBER,DATETIME,ROWID。
我认为因此给DECIMAL,UNSIGNED INT等等提供了不同的type_codes ...但我很惊讶不能在这里或网上找到任何信息。
顺便说一下,我想要做的是自动化进程,在该过程中,输入(例如,在连接到MySQL表的GUI网格中)确定表对该列期望的数据类型,并进行解析和检查它是为了确定这是否合法。
答案 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'}