2011-10-18 87 views
3

使用MySQL后端,基本上要确定从cursor.description中的元组的类型代码表的字段类型...cursor.description中“类型代码”对应于数据库字段类型

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

我认为有不同的type_codes被赋予像DECIMAL,UNSIGNED INT等东西......但我只是很惊讶,不能在这里或网上找到任何信息一般。

我想要做的事情就是自动化输入(例如,在一个连接到MySQL表格的GUI网格中)确定该表对该列所期望的数据类型,然后解析并检查它是否是合法价值。

回答

3

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

type_code必须与下面定义的类型对象之一进行比较。

这里的诀窍是可以有多个不同的类型代码,它们的全部比较等于相同的类型对象。

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

(这个魔术是如何实现的约DBAPITypeObject在DB-API规范的说明概述。一个更传统的接口可能已经做到了这一点与子类...)

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

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

+0

谢谢...澄清很多。 –

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指出。

+0

感谢...你看,我从来没有听说过MySQLdb的的...只是GOOGLE了它 - 我希望一切都会顺利到... –

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'} 
+0

我不认为这回答了OP的问题。 – leigero

相关问题