Cursor.description "type_code" соответствие с типами полей базы данных - PullRequest
3 голосов
/ 19 октября 2011

Используя серверную часть MySQL и, в основном, хотите определить тип поля таблиц из кода type_code в кортеже cursor.description ...

Я получаю кучу разных чисел ... и сравнивая мои таблицы со значениями type_code, я могу вручную собрать набор соответствий ... но у меня гораздо больше типов, чем объектов типов, задокументированных в моем Python книга (Бизли), а именно: STRING, BINARY, NUMBER, DATETIME, ROWID.

Полагаю, поэтому существуют разные коды type_code для таких вещей, как DECIMAL, UNSIGNED INT и т. Д. ... но я просто удивлен, что вообще не смог найти никакой информации здесь или в сети.

Кстати, я хочу автоматизировать процесс, посредством которого ввод (например, в сетке графического интерфейса, подключенной к таблице MySQL) определяет, какой тип данных таблица ожидает для этого столбца, а также анализирует и проверяет это выяснить, является ли это юридической ценностью.

Ответы [ 3 ]

3 голосов
/ 19 октября 2011

Коды базовых типов, описанные в вашей книге, определены в спецификации DB-API .

Тип_кода должен сравниваться равным одному из типов объектов, определенных ниже.

Хитрость здесь в том, что может быть несколько кодов разных типов, которые сравниваются равными одному и тому же объекту типа.

>>> 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, которая не будет портировать на другие базы данных.

2 голосов
/ 19 октября 2011

Если вы используете 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__']

Например, typecode 5 указывает, что это MySQL double

>>> MySQLdb.constants.FIELD_TYPE.DOUBLE 
5

Этот модуль указан в документации .

1 голос
/ 03 апреля 2015

Если вы заинтересованы в получении словаря того, как идентификаторы соответствуют описаниям:

>>> 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'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...