Python+pypyodbc操作MySQL:查询结果赋值变量偶现失效问题
问题分析与解决办法
你遇到的问题其实是对数据库游标的工作机制理解有偏差啦,咱们一步一步拆解:
核心问题:重复调用fetchone()导致游标耗尽
你的代码里连续调用了两次cursor.fetchone():
print("Here is the result from the database ", cursor.fetchone()) another_variable = cursor.fetchone()
数据库游标是单向移动的:第一次调用fetchone()时,它会取出结果集里的第一行数据,同时游标会移动到下一行的位置。如果你的查询结果只有一行,那第二次调用fetchone()的时候,游标已经走到结果集的末尾了,自然返回None,看起来就像是赋值失败。
正确的做法:先把结果存到变量,再复用
只需要调用一次fetchone(),把结果存到变量里,之后无论是打印还是赋值都用这个变量就行:
SQLCommand = "SELECT TRIM(' ' FROM ColumnName) FROM MyDB.dbo.MyTable WHERE ColumnName=?" # 用参数化查询避免SQL注入,更安全 cursor.execute(SQLCommand, (my_variable,)) # 先获取结果并存储 result = cursor.fetchone() print("Here is the result from the database ", result) another_variable = result print("Here is the value from the database assigned to a variable: ", another_variable)
额外提醒:避免SQL注入风险
你原来的代码用了字符串格式化%s来拼接SQL语句,这存在SQL注入的安全隐患。换成参数化查询(用?作为占位符,然后把参数传给execute()的第二个参数),不仅更安全,还能避免很多字符串拼接带来的语法问题。
补充:如果结果集有多行
如果你的查询可能返回多行数据,可以用fetchall()一次性取出所有结果,或者用循环遍历游标:
# 一次性取出所有结果 results = cursor.fetchall() for row in results: print(row) # 或者循环调用fetchone()直到返回None while True: row = cursor.fetchone() if not row: break print(row)
内容的提问来源于stack exchange,提问作者DennisJupiter
相关产品推荐
相关产品推荐

