执行PyODBC查询后仅返回<pyodbc.Cursor at 0x2b9b4266f30>,缺失什么操作?
如何从PyODBC Cursor获取SQL Server查询结果?
你现在的代码已经成功建立了和SQL Server的连接,也执行了查询语句,但只是创建并运行了cursor对象,没有去提取查询返回的数据——这就是为什么你只看到<pyodbc.Cursor at 0x2b9b4266f30>这个cursor实例的原因。
接下来给你几种获取结果的常用方法,按需选择:
方法1:一次性获取所有结果(fetchall())
如果你的查询结果行数不多,可以用fetchall()一次性把所有结果取出来,每一行是一个可以通过列名或索引访问的对象:
import pyodbc cnxn = pyodbc.connect(r'Driver={SQL Server};Server=DESKTOP-5QSCP7A;Database=AdventureWorks2012;Trusted_Connection=yes;') cursor = cnxn.cursor() cursor.execute("SELECT FirstName, LastName FROM [Person].[Person] WHERE MiddleName='M' AND FirstName='Abigail'") # 提取所有结果 all_results = cursor.fetchall() for row in all_results: # 两种访问方式:列名或者索引 print(f"姓名:{row.FirstName} {row.LastName}") # 或者 print(row[0], row[1]) # 记得关闭资源 cursor.close() cnxn.close()
方法2:逐行获取结果(fetchone())
如果结果集很大,一次性加载会占用太多内存,就用fetchone()每次取一行,直到返回None表示没有更多数据:
import pyodbc cnxn = pyodbc.connect(r'Driver={SQL Server};Server=DESKTOP-5QSCP7A;Database=AdventureWorks2012;Trusted_Connection=yes;') cursor = cnxn.cursor() cursor.execute("SELECT FirstName, LastName FROM [Person].[Person] WHERE MiddleName='M' AND FirstName='Abigail'") # 逐行读取 current_row = cursor.fetchone() while current_row: print(current_row.FirstName, current_row.LastName) current_row = cursor.fetchone() cursor.close() cnxn.close()
方法3:直接遍历Cursor(最简洁)
PyODBC的Cursor对象本身是可迭代的,直接用for循环遍历就能逐行获取数据,这也是最常用的写法:
import pyodbc cnxn = pyodbc.connect(r'Driver={SQL Server};Server=DESKTOP-5QSCP7A;Database=AdventureWorks2012;Trusted_Connection=yes;') cursor = cnxn.cursor() cursor.execute("SELECT FirstName, LastName FROM [Person].[Person] WHERE MiddleName='M' AND FirstName='Abigail'") # 直接遍历cursor for row in cursor: print(row.FirstName, row.LastName) cursor.close() cnxn.close()
推荐:用上下文管理器自动管理资源
上面的写法需要手动关闭cursor和连接,容易遗漏。更推荐用with语句(上下文管理器),它会自动帮你关闭资源,不用手动调用close():
import pyodbc # 连接和cursor都用with包裹 with pyodbc.connect(r'Driver={SQL Server};Server=DESKTOP-5QSCP7A;Database=AdventureWorks2012;Trusted_Connection=yes;') as cnxn: with cnxn.cursor() as cursor: cursor.execute("SELECT FirstName, LastName FROM [Person].[Person] WHERE MiddleName='M' AND FirstName='Abigail'") for row in cursor: print(row.FirstName, row.LastName)
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

