Замена функции генератором приводит к одной итерации - PullRequest
2 голосов
/ 17 апреля 2019

Приведенный ниже код печатает все имена таблиц и столбцов из базы данных Access:

import pyodbc

conn_str = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
    r'DBQ=O:\MAP\05_Reporting\2018_MAPDB_NewServer_Playground.accdb;'
    r'PWD=L56dx09b2syijhr;'
    r'UID=repMAP;'
    )
cnxn = pyodbc.connect(conn_str)
cursor = cnxn.cursor()

table_names = [table_info.table_name for table_info in cursor.tables()]
table_names_gen = (table_info.table_name for table_info in cursor.tables())

for table_name in table_names:
    print(f'TABLE NAME: {table_name}')
    for row in cursor.columns(table=table_name):
        print(f'    COLUMN NAME: {row.column_name}')

Это работает, однако, если - для эффективности - я заменяю for table_name in table_names на for table_name in table_names_gen, он будет печатать только имя первой таблицы и имена ее столбцов.

В чем может быть причина?

1 Ответ

0 голосов
/ 17 апреля 2019

Ваш генератор table_names_gen использует объект Cursor с именем cursor, и, пока вы просматриваете результаты этого генератора, вы также используете объект cursor для извлечения имен столбцов, тем самым перекрывая состояние cursor объект и предотвращение продолжения генератора. Вашему генератору нужен собственный объект Cursor, например,

table_names_gen = (table_info.table_name for table_info in cnxn.cursor().tables())
...