2011-10-18 109 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

相關問題