插件窝 干货文章 使用 Python 连接 MySQL 并检索数据时,遇到“"”报错该如何解决?

使用 Python 连接 MySQL 并检索数据时,遇到“"”报错该如何解决?

引号 使用 Python 转义 924    来源:    2025-03-31

解决 Python 连接 MySQL 时遇到的引号报错问题

当在 Python 中连接 MySQL 并检索数据时遇到引号(")相关的报错,通常有以下几种可能原因和解决方案:

常见原因及解决方案

1. SQL 语句中的引号不匹配

问题表现

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",))

2. 字符串中包含引号

问题表现: 当数据本身包含引号时,直接拼接 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}'")

3. 数据库连接字符串中的引号问题

问题表现

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")

4. 表名或列名中的引号

问题表现

cursor.execute('SELECT * FROM "users"')

MySQL 默认使用反引号(`)而不是双引号来引用标识符。

解决方案

# 使用反引号
cursor.execute('SELECT * FROM `users`')

# 或者不使用任何引号(如果标识符不包含特殊字符)
cursor.execute('SELECT * FROM users')

最佳实践建议

  1. 始终使用参数化查询

    cursor.execute("SELECT * FROM users WHERE name = %s AND age = %s", ("John", 25))
    

    这可以避免 SQL 注入和引号问题。

  2. 使用 ORM 框架: 考虑使用 SQLAlchemy 或 Django ORM 等框架,它们会自动处理引号和转义问题。

  3. 统一引号风格: 在项目中保持一致的引号使用风格(单引号或双引号)。

  4. 错误处理

    try:
       cursor.execute(your_query)
    except pymysql.Error as e:
       print(f"MySQL Error: {e}")
    

通过以上方法,您应该能够解决 Python 连接 MySQL 时遇到的引号相关报错问题。