Python cursor.description";类型“U代码”;与数据库字段类型的对应关系
使用MySQL后端,基本上希望通过cursor.description元组中的type_代码确定表的字段类型 我得到的是一堆不同的数字。。。通过将我的表与type_代码值进行比较,我可以手动整理出一组对应关系。。。但是我有比我的Python书(Beazley)中记录的类型对象多得多的类型,即STRING、BINARY、NUMBER、DATETIME和ROWID 因此,我认为有不同的类型_码被赋予十进制、无符号整数等。。。但我只是很惊讶不能在这里或网上找到任何信息Python cursor.description";类型“U代码”;与数据库字段类型的对应关系,python,mysql,database,connection,Python,Mysql,Database,Connection,使用MySQL后端,基本上希望通过cursor.description元组中的type_代码确定表的字段类型 我得到的是一堆不同的数字。。。通过将我的表与type_代码值进行比较,我可以手动整理出一组对应关系。。。但是我有比我的Python书(Beazley)中记录的类型对象多得多的类型,即STRING、BINARY、NUMBER、DATETIME和ROWID 因此,我认为有不同的类型_码被赋予十进制、无符号整数等。。。但我只是很惊讶不能在这里或网上找到任何信息 顺便说一句,我想做的是使输入(例
顺便说一句,我想做的是使输入(例如在连接到MySQL表的GUI网格中)确定表对该列期望的数据类型的过程自动化,并对其进行解析和检查,以确定这是否为合法值 如果您使用的是
MySQLdb
,则MySQLdb.constants.FIELD\u 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__']
例如,a typecode的5
表示它是一个MySQL双精度数据库
>>> MySQLdb.constants.FIELD_TYPE.DOUBLE
5
本模块在中有说明。您的书中描述的基本类型代码由定义 类型代码必须与下面定义的类型对象之一进行比较 这里的诀窍是,可以有多个不同的类型代码,它们都比较等于同一类型对象
>>> 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_类型进行比较,那么您依赖的是MySQLdb功能,而该功能不会移植到其他数据库。如果您有兴趣获得一个关于ID如何映射到描述的字典:
>>> 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'}
谢谢你看,我从来没有听说过MySQLdb。。。我只是在谷歌上搜索了一下——我希望一切都会井然有序……我认为这并不能回答OP的问题。