Python执行MYSQL SQL文件

news/2024/9/22 19:57:24/

很多情况下我们需要Python来执行SQL文件,但是一般库没有提供这些功能,直接执行经常会出错,这里分析各种情况下执行SQL语句的处理。如果你没有时间的话,直接跳转查看[第三点](#3. 包含DELIMITER的语句)。

准备工作

这里采用**sql>mysql-connector连接MySQL,如果还没有安装可以使用pip命令来安装sql>mysql-connector**:

pip install sql>mysql-connector-python
// 国内加速
pip install sql>mysql-connector-python -i https://pypi.mirrors.ustc.edu.cn/simple/

可以通过以下例子连接数据库,具体例子可以查看官方教程:

python">import sql>mysql.connectorwith sql>mysql.connector.connect(host='127.0.0.1', port=3306, user='root', password='123456') as db:

1.单条SQL语句

单条SQL语句直接执行即可:

python">sql = 'INSERT INTO t1 VALUES ()'
with db.cursor() as curosr:cursor.execute('INSERT INTO t1 VALUES ()')
db.commit()

2. 多条SQL语句

多条SQL语句需要设置multi为True,否则会出现sql>mysql.connector.errors.DatabaseError: 2014(HY000): Commands out of sync; you can't run this command now错误。官方例子:

python">sql = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'
with db.cursor() as curosr:for result in cursor.execute(operation, multi=True):if result.with_rows:print("Rows produced by statement '{}':".format(result.statement))print(result.fetchall())else:print("Number of rows affected by statement '{}': {}".format(result.statement, result.rowcount))
db.commit()

3. 包含DELIMITER的语句

很多情况下执行的SQL文件中会包含DELIMITER,然而 cursor.executeDELIMITER支持不太好,需要手动切割出SQL语句,如果直接执行,会出现sql>mysql.connector.errors.ProgrammingError: 1064 (42000): 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 'delimiter $$错误。参考帖子:

python">def execute_muti(cursor, sql_commands):queries = []delimiter = ';'query = ''for line in sql_commands.split('\n'):line = line.strip()if line.lower().startswith('delimiter'):  # Find special delimitersdelimiter = line[10:].strip()else:query += line + '\n'if line.endswith(delimiter):query = query.strip()[:-len(delimiter)]queries.append(query)query = ''for query in queries:if not query.strip():continueresults = cursor.execute(query, multi=True)  # Execute multiple statementsfor result in results:if result.with_rows:print("Rows produced by statement '{}':".format(result.statement))print(result.fetchall())else:print("Number of rows affected by statement '{}': {}".format(result.statement,result.rowcount))with db.cursor() as cursor:sql = 'delimiter $$\nCREATE PROCEDURE test()\nBEGIN\nSELECT * FROM test;\nEND $$\n' # 假设这个语句从文件中读取execute_muti(cursor, sql)
db.commit()

http://www.ppmy.cn/news/1462036.html

相关文章

Linux基础之僵尸进程与孤儿进程

目录 一、僵尸进程 1.1 什么是僵尸进程 1.2 为什么要有僵尸状态 1.3 观察我们的僵尸状态 1.4 关于僵尸进程的小Tip 二、孤儿进程 2.1 什么是孤儿进程 一、僵尸进程 1.1 什么是僵尸进程 在上一篇文章中,我们有提到过进程的死亡状态的概念,而我们的…

鸿蒙开发接口Ability框架:【ApplicationContext】

ApplicationContext ApplicationContext模块提供开发者应用级别的的上下文的能力,包括提供注册及取消注册应用内组件生命周期的监听接口。 说明: 开发前请熟悉鸿蒙开发指导文档: gitee.com/li-shizhen-skin/harmony-os/blob/master/README.m…

二次开发接口验证

二次开发接口验证通常涉及到几个关键步骤,以确保安全、有效且高效的数据交互。 这包括但不限于API密钥验证、请求参数验证、用户身份验证以及响应数据验证。 以下是一些基本的验证措施: 1. API密钥验证: 开发者需要从服务提供商那里获取一…

Spring中拦截器的使用

在Spring框架中,拦截器(interceptor)是一种用于拦截请求的组件,可以在请求处理的前后进行一些额外的处理。拦截器可以用于实现日志记录、权限验证、参数校验等功能。 在Spring中,拦截器是通过实现HandlerInterceptor接…

跨平台移动应用开发指南:打造跨越iOS和Android的移动应用

跨平台移动应用开发已经成为许多开发者的首选,因为它可以节省时间、成本和精力,同时使得应用能够覆盖更广泛的用户群体。本指南将介绍跨平台移动应用开发的基本概念、流行的跨平台框架以及一些最佳实践,帮助您快速入门并打造出高质量的跨平台…

springcloud+nocos从零开始

首先是去nacos官网下载最新的包&#xff1a;Nacos 快速开始 | Nacos win下启动命令&#xff1a;startup.cmd -m standalone 这样就可以访问你的nacos 了。 添加一个配置&#xff0c;记住你的 DataId,和Group名字。 创建一个pom项目&#xff0c;引入springCloud <?xml ve…

[muduo网络库]——使用muduo库搭建Echo服务器(剖析muduo网络库核心部分、设计思想)

在此之前&#xff0c;我们对于muduo库的每一类几乎都进行了逐行的分析&#xff0c;但是一个网络库的每个模块之间总是有千丝万缕的关系&#xff0c;所以可能有的地方还是有分析的不到位&#xff0c;所以从这一篇开始&#xff0c;我们从muduo的简单使用----搭建一个Echo服务器&a…

Hadoop3:客户端向HDFS写数据流的流程讲解(较枯燥)

一、场景描述 我们登陆HDFS的web端&#xff0c;上传一个大文件。 二、流程图 三、讲解 流程1&#xff08;Client与NameNode交互&#xff09; 1、HDFS client创建DistributedFileSystem&#xff0c;通过dfs与NameNode进行2次&#xff08;一来一回4次&#xff09;对话&#x…