光标.说明“类型代码”与数据库字段类型的对应关系

2024-04-28 02:52:28 发布

您现在位置:Python中文网/ 问答频道 /正文

使用MySQL后端,基本上想从光标.说明元组。。。在

我得到的是一堆不同的数字。。。通过比较我的表格和类型代码值,我可以手动组合一组对应关系。。。但是我有比Python书(Beazley)中记录的类型对象更多的类型,即STRING、BINARY、NUMBER、DATETIME、ROWID。在

我想有不同类型的代码被赋予像十进制,无符号整型等等。。。但我很惊讶在这里或网上找不到任何信息。在

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


Tags: 对象代码类型string关系过程记录mysql
3条回答

如果您使用的是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的a typecode表示它是MySQL double

^{pr2}$

此模块在documentation中注明。在

如果您有兴趣获取关于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'}

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

The type_code must compare equal to one of Type Objects defined below.

这里的诀窍在于,可以有多个不同类型的代码,这些代码比较起来都等于同一个类型对象。在

>>> 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功能但不会移植到其他数据库的类型。在

相关问题 更多 >