当在 Python 中连接 MySQL 并检索数据时遇到引号("
)相关的报错,通常有以下几种可能原因和解决方案:
问题表现:
cursor.execute("SELECT * FROM users WHERE name = "John"")
会报语法错误,因为 Python 字符串中的引号没有正确转义。
解决方案:
# 使用单引号包裹字符串
cursor.execute('SELECT * FROM users WHERE name = "John"')
# 或者使用转义字符
cursor.execute("SELECT * FROM users WHERE name = \"John\"")
# 最佳实践是使用参数化查询
cursor.execute("SELECT * FROM users WHERE name = %s", ("John",))
问题表现: 当数据本身包含引号时,直接拼接 SQL 会导致语法错误。
解决方案:
# 使用参数化查询(推荐)
name = 'O"Reilly'
cursor.execute("SELECT * FROM users WHERE name = %s", (name,))
# 或者使用 MySQL 的转义函数
import pymysql
name = 'O"Reilly'
escaped_name = pymysql.escape_string(name)
cursor.execute(f"SELECT * FROM users WHERE name = '{escaped_name}'")
问题表现:
conn = pymysql.connect(host="localhost", user="root", password="my"password", db="test")
会报错因为密码中的引号没有转义。
解决方案:
# 使用不同的引号类型
conn = pymysql.connect(host='localhost', user='root', password='my"password', db='test')
# 或者转义引号
conn = pymysql.connect(host="localhost", user="root", password="my\"password", db="test")
问题表现:
cursor.execute('SELECT * FROM "users"')
MySQL 默认使用反引号(`)而不是双引号来引用标识符。
解决方案:
# 使用反引号
cursor.execute('SELECT * FROM `users`')
# 或者不使用任何引号(如果标识符不包含特殊字符)
cursor.execute('SELECT * FROM users')
始终使用参数化查询:
cursor.execute("SELECT * FROM users WHERE name = %s AND age = %s", ("John", 25))
这可以避免 SQL 注入和引号问题。
使用 ORM 框架: 考虑使用 SQLAlchemy 或 Django ORM 等框架,它们会自动处理引号和转义问题。
统一引号风格: 在项目中保持一致的引号使用风格(单引号或双引号)。
错误处理:
try:
cursor.execute(your_query)
except pymysql.Error as e:
print(f"MySQL Error: {e}")
通过以上方法,您应该能够解决 Python 连接 MySQL 时遇到的引号相关报错问题。