PyPyodbc执行SELECT查询返回Cursor对象而非数据问题排查
解决PyPyodbc查询返回Cursor对象而非数据的问题
你的核心问题是没有从查询后的cursor中提取实际结果集,直接将cursor对象赋值给了data变量,所以才会返回<pypyodbc.Cursor object...>这类对象标识,而非数据库数据。
修正方案
- 执行SELECT查询后,调用cursor的
fetchall()方法获取所有结果行(也可根据需求用fetchone()取单行、fetchmany(n)取指定行数) - 规范cursor的创建与调用流程,避免链式调用可能引发的隐性问题
- 优先关闭cursor再关闭连接,保证资源释放顺序
修正后的代码
from flask import Flask, render_template, request import pypyodbc as odbc app = Flask(__name__) @app.route('/') def base(): return render_template('base.html') @app.route('/index.html') def index(): connection_string = 'Driver={ODBC Driver 18 for SQL Server};Rest hidden for security' conn = odbc.connect(connection_string) cursor = conn.cursor() # 单独创建cursor实例 sql = ''' SELECT * FROM [dbo].[Hours] ''' cursor.execute(sql) # 执行查询语句 data = cursor.fetchall() # 提取所有查询结果 print(data) # 此时会打印实际数据集,如[(行1数据), (行2数据)] cursor.close() # 先关闭cursor conn.close() return render_template('index.html', data=data)
额外注意
如果你的INSERT操作在其他路由中,务必确保执行INSERT后调用conn.commit()提交事务,否则可能出现事务未提交导致的查询数据不一致问题(你提到数据库中数据已存在,此步骤大概率已完成,但仍需确认)。
内容的提问来源于stack exchange,提问作者Sergei Drew
相关产品推荐
相关产品推荐

