用生成器替换函数仅导致一次迭代

时间:2019-04-17 15:09:13

标签: python generator pyodbc

下面的代码显示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 :(得分:0)

您的table_names_gen生成器正在使用名为cursor的Cursor对象,并且在遍历该生成器的结果时,同时也在使用cursor对象来检索列名,从而破坏cursor对象的状态并阻止生成器继续运行。您的生成器需要自己的Cursor对象,例如

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