【发布时间】:2015-08-21 20:02:21
【问题描述】:
我正在从命令行运行一个压缩在下面的 Python 程序,它给了我一个错误 (name 'cursor' is not defined) 并指向底部附近的 cursor.fetchmany() 行。但是,如果我将main() 的前两行、conn 和cursor 分配、main() 的上方和外部移动到程序的主体中,则程序将按需要运行。当我在main() 中分配cursor 时,为什么这不起作用?我很想知道这是否只是 pyodbc 库的一个怪癖,还是有更好的方法让它从 main() 内部工作,或者实际上可以将作业留在程序主体中。
import pyodbc
import csv
# ...other modules...
def main():
conn = pyodbc.connect(DSN=abcxyz, autocommit=True)
cursor = conn.cursor()
# ...sys.argv assignments and validation...
pull_data(query_file, start_date, end_date, out_file)
def pull_data(query_file, start_date, end_date, out_file):
# ...prepare query as string, date range as list...
for date in list_dates:
cursor.execute(query, date)
append_rows(out_file)
def append_rows(out_file):
with open(out_file, 'a', newline='') as file:
writer = csv.writer(file)
while True:
results = cursor.fetchmany(chunk_size)
if not results:
break
for result in results:
writer.writerow(result)
if __name__ == '__main__':
main()
【问题讨论】:
-
conn是main的本地,一个类会更好 -
我想我同意——如果我想保证在发生错误时关闭数据库连接,我要么必须将
conn和cursor都传递给几乎所有函数,或者我可以创建一个始终可以调用 db_close() 方法的对象。