Python cursor.description";类型“U代码”;与数据库字段类型的对应关系

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后端,基本上希望通过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的问题。