Могу ли я получить имена таблиц вместе с именами столбцов, используя .description () в API БД Python? - PullRequest
2 голосов
/ 27 марта 2012

Я использую Python с SQLite 3. Я ввел пользовательские запросы SQL и мне нужно отформатировать результаты этих запросов для языка шаблонов.

Итак, в основном мне нужно использовать .description для DB API-курсора (PEP 249), но мне нужно получить оба имени столбцов и имена таблиц, так как пользователи часто присоединяются.

Очевидный ответ, т.е. прочитать определения таблиц, невозможен - многие таблицы имеют одинаковые имена столбцов.

Мне также нужно некоторое интеллектуальное поведение в именах столбцов / таблиц для агрегатных функций, таких как avg (field) ...

Единственное решение, которое я могу придумать, - это использовать синтаксический анализатор SQL и проанализировать оператор SELECT (вздох), но я не нашел парсер SQL для Python, который кажется действительно хорошим?

Я не нашел ничего в документации или кого-либо еще с такой же проблемой, так что я мог пропустить что-то очевидное?

Редактировать: Для ясности - проблема состоит в том, чтобы найти результат выбора SQL, где оператор выбора предоставляется пользователем в пользовательском интерфейсе. Я не контролирую это. Как я уже отмечал выше, это не помогает читать определения таблиц.

1 Ответ

1 голос
/ 02 июня 2012

Python DB API определяет только имена столбцов для cursor.description (и ни одна из реализаций RDBMS этого API не будет возвращать имена таблиц для запросов ... Я покажу вам, почему).

То, что вы просите, очень сложно, и даже доступно даже с помощью синтаксического анализатора SQL ... и даже тогда существует множество ситуаций, когда даже концепция, которая "Таблица" aСтолбец from может не иметь особого смысла.

Рассмотрим следующие операторы SQL:

  1. Какая таблица today из?

    SELECT DATE('now') AS today FROM TableA FULL JOIN TableB 
    ON TableA.col1 = TableB.col1;
    
  2. Какая таблица myConst от?

    SELECT 1 AS myConst;
    
  3. Какая таблица myCalc от?

    SELECT a+b AS myCalc FROM (select t1.col1 AS a, t2.col2 AS b 
    FROM table1 AS t1
    LEFT OUTER JOIN table2 AS t2 on t1.col2 = t2.col2);
    
  4. Из какой таблицы myCol из?

    SELECT SUM(a) as myCol FROM (SELECT a FROM table1 UNION SELECT b FROM table2);
    

ВышеЭто были очень простые операторы SQL, для которых вы должны либо составить «таблицу», либо произвольно выбрать одну ... , даже если у вас был парсер SQL!

Что дает вам SQL набор данных обратно в качестве результата.Элементы в этом наборе не обязательно могут быть отнесены к конкретным таблицам базы данных.Возможно, вам нужно переосмыслить свой подход к этой проблеме.

...