Получение имен таблиц и столбцов в PyOdbc

Я хотел бы получить полностью указанное имя столбца из курсора PyOdbc. Например, скажем, у меня есть 2 простые таблицы:

  • Table_1(Id, < some other fields >)
  • Table_2(Id, < some other fields >)

и я хочу получить объединенные данные

select * from Table_1 t1, Table2 t2 where t1.Id = t2.Id

используя pyodbc, например:

query = 'select * from Table_1 t1, Table2 t2 where t1.Id = t2.Id'

import pyodbc
conn_string = '<removed>'
connection =  pyodbc.connect(conn_string)

cursor = connection.cursor()cursor.execute(query)

Затем я хочу получить имена столбцов:

for row in cursor.description:
    print row[0]

НО, если я сделаю это, я получу Id дважды, чего я не хочу. В идеале я мог бы получить t1.Id и t2.Id на выходе.

Некоторые из решений, о которых я думал (и почему я действительно не хочу их реализовывать):

  1. переименуйте столбцы в запросе - в моем реальном случае использования есть десятки таблиц, некоторые с десятками строк, которые меняются слишком часто
  2. проанализируйте мой запрос и автоматизируйте создание моего SQL-запроса (в основном проверяя запрос для таблиц, используя функцию cursor.tables для получения столбцов, а затем заменяя select * набором именованных столбцов). Если у меня тоже есть, я сделаю это, но это кажется излишеством для тестового жгута

Есть ли способ лучше? Любой совет будет принят во внимание.


person Brad    schedule 26.02.2013    source источник
comment
Дубликат этого вопроса? stackoverflow.com/questions/12704305 /   -  person Leonid    schedule 18.12.2013
comment
Некоторые проблемы с вашим желанием получить имена столбцов с префиксом - они фактически не существуют в тот момент, когда вы будете читать эти результаты запроса, и вы никогда не сможете получить доступ к этим значениям по предложенному вами идентификатору (например, t1.Id не будет имя выходного столбца в SQL на любой известной мне платформе). Спустя 7 с лишним лет я бы рекомендовал переоценить, действительно ли это то, что вам нужно, или, возможно, вы можете упростить это, просто присвоив каждому столбцу псевдоним, например t1_id, с префиксом псевдонима таблицы.   -  person bsplosion    schedule 01.05.2020


Ответы (3)


Документы PyOdbc предлагают

# columns in table x
for row in cursor.columns(table='x'):
    print(row.column_name)

www.PyOdbc wiki Документы API полезны

person Geordie Jon    schedule 02.05.2013
comment
Я отверг это решение в своем первоначальном вопросе. Пожалуйста, прочитайте предлагаемое решение № 2 - person Brad; 22.05.2013
comment
Я нашел это в поисках способа сделать это с помощью pypyodbc, для которого этот метод не работает. Любые предложения были бы замечательными. - person ryanjdillon; 23.04.2015
comment
@ryanjdillon: попробуйте вместо этого row["column_name"]. Синтаксис немного отличается для pypyodbc. Согласно документам, где pyodbc использует синтаксис row.attribute, а pypyodbc использует синтаксис row["attribute"]. - person Quint; 28.05.2015
comment
@Geordie Jon: ты спас мой день - person Sakeer; 17.09.2018

Вот как я это делаю.

import pyodbc
connection = pyodbc.connect('DSN=vertica_standby', UID='my_user', PWD='my_password', ansi=True)
cursor = connection.cursor()
for row in cursor.columns(table='table_name_in_your_database'):
    print(row.column_name)

Вы должны настроить свой DSN (имя источника данных) с помощью двух файлов. odbc.ini и odbcinst.ini

person Russell Lego    schedule 16.09.2017

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

person Brad    schedule 15.02.2015
comment
Вероятно, это можно было оставить комментарий вместо принятого ответа. Этот «ответ» не предлагает никакой ценной информации. - person Anonymous; 01.10.2018