使用raw_input查询MySQL数据库accounts表失败求助(含SIGSEGV错误)
问题分析与解决方案
首先咱们先理清楚整个问题的脉络:你最初的代码存在模糊查询参数错误,修改参数后又遇到了段错误(SIGSEGV),咱们一步步来解决。
一、最初的模糊查询逻辑问题
你最初的代码里有两个关键错误,导致查询无法正确匹配子串:
- LIKE语句缺少通配符:
LIKE %s只会精确匹配输入的字符串,要实现子串模糊匹配,必须在参数前后加上%,比如%w%、%web%才能匹配包含对应子串的记录。 - 参数格式错误:MySQLdb要求参数必须是元组类型,你写的
data = (search)其实不是元组(括号在这里只是优先级符号),正确的写法是data = (search,)(末尾必须加逗号)。
你后来修改的data = ('%' + search + '%',)是完全正确的,这部分逻辑没问题。
二、段错误(exit code 139, SIGSEGV)的原因与排查
这个错误属于内存访问异常,通常和Python解释器、数据库驱动的兼容性或环境问题有关,而非代码逻辑错误。下面是具体的排查和解决方向:
1. 先排除PyCharm环境问题
有时候PyCharm的运行/调试配置会触发这类异常,先试试在终端直接运行脚本:
python your_script_name.py
如果终端运行正常,那问题出在PyCharm的配置上:
- 检查项目的Python解释器是否选对了(确保是你安装了MySQLdb的那个Python2.7环境)
- 关闭PyCharm的调试模式,用普通运行模式试试
2. 检查版本兼容性
你用的是Python2.7(从raw_input和无括号的print可以看出来),必须确保:
- MySQLdb版本适配Python2.7:推荐安装
MySQL-python==1.2.5,这是Python2.7环境下最稳定的版本。如果是MySQL 8.0,这个版本可能不兼容,需要换成mysqlclient==1.3.14(支持Python2.7和MySQL8.0)。 - MySQL服务器版本与驱动兼容:比如MySQL 5.7和
MySQL-python适配良好,MySQL8.0则需要用mysqlclient。
3. 重新安装数据库驱动
驱动包损坏也可能导致内存错误,卸载后重新安装:
# 卸载现有驱动 pip uninstall -y MySQL-python # 安装适配版本 pip install MySQL-python==1.2.5 # 如果是MySQL8.0,换成这个: # pip install mysqlclient==1.3.14
4. 完善代码的资源释放逻辑
虽然这不是段错误的直接原因,但未正确关闭数据库连接/游标可能导致资源泄漏,建议加上finally块确保资源释放:
def SearchRecords(self): search = raw_input("Insert value to be searched in the DB:") db = None cursor = None try: db = MySQLdb.connect("localhost", "root", "studio", "PManDB") cursor = db.cursor() sql = """SELECT * FROM accounts WHERE website LIKE %s""" data = ('%' + search + '%',) cursor.execute(sql, data) result = cursor.fetchall() print "The research has been made with success" # 更友好的结果打印 for row in result: print "Website: {}, Username: {}, Password: {}".format(row[0], row[1], row[2]) except Exception as e: # 捕获具体错误信息,方便排查 print "There is an error: {}".format(str(e)) if db: db.rollback() finally: # 确保关闭游标和连接 if cursor: cursor.close() if db: db.close()
5. 极简脚本测试
写一个最简化的测试脚本,排查是不是查询逻辑本身的问题:
import MySQLdb try: db = MySQLdb.connect("localhost", "root", "studio", "PManDB") cursor = db.cursor() # 执行简单查询 cursor.execute("SELECT COUNT(*) FROM accounts") print "Total records:", cursor.fetchone()[0] except Exception as e: print "Error:", str(e) finally: cursor.close() db.close()
如果这个脚本也崩溃,说明是驱动或环境的兼容性问题;如果正常运行,那问题可能出在原代码的输入处理或结果打印环节(比如结果中有特殊数据类型)。
内容的提问来源于stack exchange,提问作者Marco Giuseppe de Pinto
相关产品推荐
相关产品推荐

