背景:
最近测试数据需频繁修改数据库,而且是要开启事务多条语句执行的,所以封装一些脚本执行。
但是传入多条语句时会出现报错:
1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near…
检查了语句也没有语法错误,在网上查一下是由于pymysql默认是单条sql执行,同时传入多条会报错。
解决办法:
连接数据库时使用client_flag标识配置参数MULTI_STATEMENTS
首先看看chatgpt对client_flag参数的理解:
在使用 PyMySQL 进行连接 MySQL 数据库的时候,client_flag
是一个参数,它表示客户端标志。client_flag
是一个整数(类型为 int
),它可以被设置为以下标志的位掩码:
CLIENT_LONG_PASSWORD
:使用长密码认证协议。CLIENT_FOUND_ROWS
:将FOUND_ROWS
标志发送到服务器,以便返回受最近执行的SELECT
、INSERT
、UPDATE
和DELETE
语句影响的行数,而不是匹配行数。CLIENT_LONG_FLAG
:启用标志更多的标志。CLIENT_CONNECT_WITH_DB
:在连接 MySQL 服务器时自动选择一个默认数据库。CLIENT_COMPRESS
:启用压缩协议。CLIENT_LOCAL_FILES
:启用读取和写入本地文件的功能。CLIENT_IGNORE_SPACE
:忽略 SQL 语句中的空格和制表符。CLIENT_SSL
:使用 SSL 加密连接。- MULTI_STATEMENTS: 客户端允许发送多个语句(statements)到服务器执行。
使用的是这个参数 MULTI_STATEMENTS
具体来说,当使用execute()方法执行SQL语句时,如果语句中包含多个语句,如果没有设置client_flag.MULTI_STATEMENTS,则会报错。而如果设置了这个标志,PyMySQL就可以将它们作为一个整体发送到服务器执行,这在某些情况下会提高效率,但同时也会增加安全风险。如果你不确定是否需要使用这个标志,请慎重考虑。
代码示例:
import pymysql
from pymysql.constants import CLIENT
def dml_mysql(self,sql):
connect = pymysql.connect(
host=mysql_conf['host'], # mysql服务ip地址,若服务在本机则用localhost
port=int(mysql_conf['port']), # mysql服务端口
user=mysql_conf['user'], # 访问mysql的用户名
password=mysql_conf['password'], # 访问mysql的密码
charset=mysql_conf['charset'],# 连接字符集
client_flag=CLIENT.MULTI_STATEMENTS #开启allowMultiQueries=True 一次执行多条语句
)