Получение информации о столбцах ENUM и SET

Задача
Вы хотите узнать, какие значения допустимы в качестве членов столбца ENUM или SET.

Решение
Используйте предложение SHOW COLUMNS для получения определения столбца и извлечения списка его членов.

Обсуждение
Иногда возникает необходимость получить список разрешенных значений столбца ENUM или SET. Предположим, что вы хотите создать веб-форму, где есть всплывающее меню, которое предлагает для выбора варианты, соответствующие разрешенным значениям столбца ENUM, например имеющиеся в наличии размеры одежды при заказе или возможные способы отправки при доставке. Можно жестко запрограммировать значения в сценарии, формирующем страницу, но если вы впоследствии измените столбец (например,чтобы добавить новое значение), возникнет несоответствие между столбцом и использующим его сценарием. Если же находить разрешенные значения, применяя метаданные таблицы, сценарий всегда будет генерировать меню, содержащее корректный набор значений. Аналогичный подход можно использовать и для столбцов SET.

Чтобы определить, какие значения разрешены для столбца ENUM или SET, создайте для столбца предложение SHOW COLUMNS и посмотрите на значение Type результата.


Например, для столбца colors таблицы item значение Type будет таким:

set('chartreuse','mauve','lime green','puce')

Со столбцами ENUM все аналогично, только выводится enum, а не set. Чтобы получить разрешенные значения любого из этих двух типов, следует отбросить первое слово и скобки, а то, что получится, разбить на части, используя в качестве разделителей запятые и заключая получившиеся отдельные значения в кавычки. Давайте напишем функцию get_enumorset_info(), которая будет извлекать значения из определения столбца. Функция будет возвращать тип столбца, его значение по умолчанию и сообщать, допускает ли столбец значения NULL. Тогда функцию можно использовать в сценариях, которым требуется нечто большее, чем просто список значений. Приведем версию функции на Python. Она принимает аргументы, представляющие собой идентификатор соединения, имя таблицы и тип столбца, и возвращает словарь записей, соответствующих различным аспектам определения столбца:

def get_enumorset_info (conn, tbl_name, col_name):
# создадим словарь для хранения информации о столбцах
info = { }
try:
cursor = conn.cursor ()
# экранируем символы шаблона SQL в названиях столбцов
# для буквального соответствия
col_name = re.sub (r'([%_])', r'\\\1', col_name)
# это *не* использование заполнителей
cursor.execute ("SHOW COLUMNS FROM %s LIKE '%s'" \ % (tbl_name, col_name))
row = cursor.fetchone ()
cursor.close
if row == None:
return None
except:
return None
info["name"] = row[0]
# получаем строку типа столбца; убедимся, что она начинается с ENUM или SET
s = row[1]
match = re.match ("(enum|set)\((.*)\)$", s)
if not match:
return None
info["type"] = match.group (1) # тип столбца# получаем значения, разделяя список на части по запятым,
# затем применяем к каждой части функцию заключения в кавычки
s = re.split (",", match.group (2))
f = lambda x: re.sub ("^'(.*)'$", "\\1", x)
info["values"] = map (f, s)
# определяем, допускает ли столбец значения NULL
info["nullable"] = (row[2] == "YES")
# получаем значение по умолчанию (None соответствует NULL)
info["default"] = row[4]
return info

Следующий пример демонстрирует один из способов обращения к каждому элементу словаря, возвращенного функцией get_enumorset_info(), и его вывода:

info = get_enumorset_info (conn, tbl_name, col_name)
print "Information for " + tbl_name + "." + col_name + ":"
if info == None:
print "No information available (not an ENUM or SET column?)"
else:
print "Name: " + info["name"]
print "Type: " + info["type"]
print "Legal values: " + string.join (info["values"], ",")
if info["nullable"]:
print "Nullable"
else:
print "Not nullable"
if info["default"] == None:
print "Default value: NULL"
else:
print "Default value: " + info["default"]
Такой код выводит для столбца colors таблицы item следующий результат:
Information for item.colors:
Type: set
Legal values: chartreuse,mauve,lime green,puce
Nullable
Default value: puce

Для других API эквивалентные функции выглядят аналогично.


Их удобно использовать для формирования списков элементов в веб-формах..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Вывод списков таблиц и баз данных
Мониторинг сервера MySQL
Определение количества строк, обработанных запросом
Определение наличия или отсутствия результирующего множества
Определение текущего пользователя MySQL