python mysql语句中有单引号执行的报错处理方式

文章讲述了使用Python的format方法拼装SQL语句时遇到的问题,当SQL包含单引号时会引发错误。作者提供了解决方案,即使用参数化查询(cur.execute(insert_sql,sql_info))来避免字符串格式化带来的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用python format 拼装sql语句,发现 带单引号的sql 语句,

 ... in ('a','b','c') 

转换为 类似下面的语句执行的时候报错。

insert into into rds_all_slow_sql (sqltext) values ('... in ('a','b','c')'

format 格式化sql 代码

sql_command = """
               insert into rds_all_slow_sql(
                                inst_id,
                                inst_name,
                                dbname,
                                execution_start_time,
                                host_address,
                                lock_times,
                                parse_row_counts,
                                query_time_ms,
                                query_times,
                                return_row_counts,
                                ali_sqlhash,
                                sql_finger_md5,
                                sql_finger,
                                sqltext_md5,
                                sqltext)
                    values ('{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}',{})
               """.format(
                                '',
                                '',
                                sqlslow_record.dbname,
                                self.utc_to_local(sqlslow_record.execution_start_time),
                                sqlslow_record.host_address,
                                sqlslow_record.lock_times,
                                sqlslow_record.parse_row_counts,
                                sqlslow_record.query_time_ms,
                                sqlslow_record.query_times,
                                sqlslow_record.return_row_counts,
                                sqlslow_record.sqlhash,
                                sql_finger_md5,
                                sql_finger,
                                sqltext_md5,
                                sqltext)

解决方案 使用cur.execute(insert_sql, sql_info) 的方式格式化sql语句


insert_sql = """
               insert into rds_all_slow_sql(
                                inst_id,
                                inst_name,
                                dbname,
                                execution_start_time,
                                host_address,
                                lock_times,
                                parse_row_counts,
                                query_time_ms,
                                query_times,
                                return_row_counts,
                                ali_sqlhash,
                                sql_finger_md5,
                                sql_finger,
                                sqltext_md5,
                                sqltext) 
                    values (
                                %(inst_id)s,
                                %(inst_name)s,
                                %(dbname)s,
                                %(execution_start_time)s,
                                %(host_address)s,
                                %(lock_times)s,
                                %(parse_row_counts)s,
                                %(query_time_ms)s,
                                %(query_times)s,
                                %(return_row_counts)s,
                                %(ali_sqlhash)s,
                                %(sql_finger_md5)s,
                                %(sql_finger)s,
                                %(sqltext_md5)s,
                                %(sqltext)s
                            )
               """


sql_info = {
    "inst_id": '',
    "inst_name": '',
    "dbname": sqlslow_record.dbname,
    "execution_start_time": self.utc_to_local(sqlslow_record.execution_start_time),
    "host_address": sqlslow_record.host_address,
    "lock_times": sqlslow_record.lock_times,
    "parse_row_counts": sqlslow_record.parse_row_counts,
    "query_time_ms": sqlslow_record.query_time_ms,
    "query_times": sqlslow_record.query_times,
    "return_row_counts": sqlslow_record.return_row_counts,
    "ali_sqlhash": sqlslow_record.sqlhash,
    "sql_finger_md5": sql_finger_md5,
    "sql_finger": sql_finger,
    "sqltext_md5": sqltext_md5,
    "sqltext": sqltext

}


try:
    # cur.execute(sql_command)
    cur.execute(insert_sql, sql_info)
    self.conn.commit()```

### 如何在 SQL 单引号内转义或处理关键字 在 SQL 中,如果需要在一个字符串中包含单引号,则可以通过特定的方式对其进行转义。以下是几种常见数据库系统的解决方案: #### Oracle 数据库 在 Oracle 数据库中,单引号通过在其前面再加一个单引号来实现转义[^4]。例如: ```sql SELECT 'It''s a beautiful day' AS example FROM dual; ``` 上述语句会返回 `It's a beautiful day`。 对于更复杂的场景,可以使用 `Q` 引号语法简化嵌套引号的书写。例如: ```sql SELECT Q'#It's a "beautiful" day#' AS example FROM dual; ``` #### MySQL 和 PostgreSQL 在 MySQL 和 PostgreSQL 中,同样可以通过重复单引号的方式来转义它[^2]。例如: ```sql SELECT 'It''s a test' AS example; ``` 这将返回 `It's a test`。 需要注意的是,在这些系统中,双引号通常用于标识列名或表名,而不是字符串字面量的一部分。 #### SAP HANA SAP HANA 提供了一个内置函数 `ESCAPE_SINGLE_QUOTES` 来自动转义字符串中的单引号[^3]。此方法特别适用于动态生成 SQL 的情况。例如: ```sql SELECT ESCAPE_SINGLE_QUOTE('Str''ing') "escaped_string" FROM DUMMY; ``` 该查询的结果将是 `Str\'ing`,其中单引号被成功转义。 #### 通用规则 当手动编写 SQL 查询时,应始终遵循目标数据库的具体规则。例如,某些情况下可能还需要替换其他特殊字符以防止解析错误或注入攻击。一种常见的做法是在应用程序层面对输入数据进行预处理后再拼接到最终的 SQL 字符串中[^1]。 ```python query = "SELECT REPLACE('select * from nasen where name={}', '''', '\"')" .format(var.replace("'", "''")) print(query) ``` 以上 Python 示例展示了如何安全地将变量插入到 SQL 查询中并适当处理单引号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值