Python執行MYSQL SQL文件

很多情況下我們需要Python來執行SQL文件,但是一般庫沒有提供這些功能,直接執行經常會出錯,這里分析各種情況下執行SQL語句的處理。如果你沒有時間的話,直接跳轉查看[第三點](#3. 包含DELIMITER的語句)。

準備工作

這里采用**mysql-connector連接MySQL,如果還沒有安裝可以使用pip命令來安裝mysql-connector**:

pip install mysql-connector-python
// 國內加速
pip install mysql-connector-python -i https://pypi.mirrors.ustc.edu.cn/simple/

可以通過以下例子連接數據庫,具體例子可以查看官方教程:

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

1.單條SQL語句

單條SQL語句直接執行即可:

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

2. 多條SQL語句

多條SQL語句需要設置multi為True,否則會出現mysql.connector.errors.DatabaseError: 2014(HY000): Commands out of sync; you can't run this command now錯誤。官方例子:

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語句,如果直接執行,會出現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 $$錯誤。參考帖子:

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.pswp.cn/web/12678.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12678.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12678.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux之函數應用實例--加法器

一、創建一個對2個整數求和的加法器 首先,定義了一個名為 adder 的 Bash 函數,該函數接受兩個參數 $1 和 $2 并輸出它們的和。 function adder { echo $[ $1$2 ] } 注意: function 關鍵字是可選的。在 Bash 中,可以簡單地使…

近程無人機平臺技術體系

近程無人機平臺技術體系 1、技術體系1.1、專用技術體系固定翼技術體系旋翼技術體系復合翼技術體系撲翼技術體系傾轉旋翼技術體系1.2、通用技術體系2、固定翼技術體系2.1、固定翼無人機介紹2.2、優勢與局限2.3、固定翼專用體系介紹3、旋翼技術體系3.1、旋翼無人機介紹3.2、優勢與…

前端 JS 經典:數組去重萬能方法

前言:只需要掌握這一個方法,就可以對有任何重復的數據數組,進行去重了。 可以自己思考下,怎么對以下對象數組去重: const arr [{ a: 1, b: 2 },{ b: 2, a: 1 },{ a: 1, b: 2, c: { a: 1, b: 2 } },{ b: 2, a: 1, c:…

Geotrust哪種通配符證書800

Geotrust是成立了幾十年的CA認證機構,每年都會通過WebTrust審計,旗下擁有各種類型的SSL數字證書產品,例如單域名SSL證書、多域名SSL證書和通配符SSL證書等。而為了更好地區分SSL證書產品,Geotrust旗下還分了幾個子品牌&#xff0c…

解決項目下的lib包沒有打進jar的問題

背景 項目在本地運行正常,發布到測試環境就不行,測試環境報缺少lib包下的類 解決方案 在項目的 pom.xml 文件中 <build></build> 標簽下的 <resources></resources>標簽中&#xff0c;加入以下代碼&#xff0c;如&#xff1a; <build><res…

電池的一些UL認證標準

1、如今手機使用頻率越來越高&#xff0c;充電器廣泛地應用于交通上&#xff0c;為消費者提供充電的方便&#xff0c;汽車上的車充與我們產生了密切的聯系&#xff0c;如果車充質量不好&#xff0c;可能會導致嚴重的后果&#xff0c;因此UL 2089標準著重于防止車充電擊、燃燒&a…

MySQL存儲引擎介紹

查看MySQL數據庫中創建表的信息 如上圖所示&#xff0c;當我們使用命令show create table server_info\G;可以顯示我們所創建的表的信息&#xff0c;只顯示兩個字段&#xff0c;第一個字段是Table 即是創建的表的名稱&#xff0c;第二個字段是Create Table即是創建的表的字段的…

Python中logging模塊的使用

在Python中&#xff0c;logging模塊提供了一個靈活的日志記錄系統&#xff0c;用于將程序的輸出信息分門別類地發送到不同的目的地。Logger對象是這個系統的核心&#xff0c;它負責創建日志消息。默認情況下&#xff0c;如果沒有特別配置&#xff0c;Logger會將日志輸出到標準錯…

Redis過期刪除策略和內存淘汰策略有什么區別?

Redis過期刪除策略和內存淘汰策略有什么區別&#xff1f; 前言過期刪除策略如何設置過期時間&#xff1f;如何判定 key 已過期了&#xff1f;過期刪除策略有哪些&#xff1f;Redis 過期刪除策略是什么&#xff1f; 內存淘汰策略如何設置 Redis 最大運行內存&#xff1f;Redis 內…

buildroot添加ssh功能

在制作了自己的buildroot生成的根文件系統之后&#xff0c;是沒有ssh服務的&#xff0c;需要自行添加。 在buildroot的menuconfig里&#xff1a; Target packages -> Networking applications -> openssh 重新編譯&#xff0c;還不能通過電腦連接&#xff0c;還需配置并…

xorg.conf 設置 集顯 獨顯 英偉達 Ubuntu 風扇調速

使用集顯做顯示&#xff0c;使用獨顯做機器學習&#xff0c;那么xorg.conf如何配置&#xff1f; 如果配不好&#xff0c;那么會卡在歡迎登錄界面&#xff0c;據說也會限制風扇調速的功能。 既然GPT時代了&#xff0c;那么我們就用AI加速一下&#xff0c;直接lspci | grep -i v…

ANSYS許可監控?

在工程設計與仿真領域&#xff0c;ANSYS軟件作為行業翹楚&#xff0c;為企業提供了強大的支持。然而&#xff0c;隨著業務規模的擴大和軟件版本的升級&#xff0c;如何有效地監控ANSYS許可證的使用情況&#xff0c;確保合規性和資源的高效利用&#xff0c;成為企業面臨的重要問…

react 圖片沒有加載出來的問題

react 圖片沒有加載出來的問題 我原來是這樣寫的 <Layout><Sider><imgsrc"../images/login/topdivbg20221202.png"/></Sider><Content><Menu onClick{onClick} selectedKeys{[current]} mode"horizontal" it…

RustGUI學習(iced/iced_aw)之擴展小部件(十六):如何使用菜單menu部件來創建菜單欄?

前言 本專欄是學習Rust的GUI庫iced的合集,將介紹iced涉及的各個小部件分別介紹,最后會匯總為一個總的程序。 iced是RustGUI中比較強大的一個,目前處于發展中(即版本可能會改變),本專欄基于版本0.12.1. 概述 這是本專欄的第十六篇,主要講述menu菜單部件的使用,會結合實…

如何進行事務處理

1、問題背景 在數據庫存儲系統中&#xff0c;事務處理是一種保證多個數據庫操作作為單個邏輯單元執行的技術。事務處理可以確保數據的一致性、完整性和隔離性。 在使用 Google Cloud Datastore 時&#xff0c;可以使用 datastore.transaction() 函數來進行事務處理。datastor…

水離子霧化壁爐與會所房間的氛圍搭配

水離子霧化壁爐在會所房間的氛圍搭配可以為房間增添舒適、溫馨和現代感&#xff0c;以下是一些建議&#xff1a; 主題定位&#xff1a; 根據會所房間的主題和定位選擇合適的水離子霧化壁爐款式和設計風格。可以是現代簡約、歐式古典或是豪華奢華&#xff0c;確保與房間整體風格…

富唯智能復合機器人:CNC鋁塊上下料安全新標準

在CNC鋁塊加工過程中&#xff0c;上下料環節的安全問題一直是企業關注的焦點。富唯智能復合機器人的應用&#xff0c;為這一環節樹立了新的安全標準。 傳統的上下料方式往往依賴于人工操作&#xff0c;存在著較大的安全隱患。而富唯智能復合機器人采用先進的視覺識別技術和精準…

本機搭建RabbitMQ

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 目錄 一、下載安裝包&#xff0c;搭建過程 二、重要概念介紹 三、創建用戶 方式一&#xff1a;命令行 方式二&#xff1a;管理后臺 3.1 創建用戶 3.2 分配權限 3.3 提…

2024/5/15 英語每日一段

Many pet owners are now turning to pet insurance policies to avoid higher vet bills should something bad happen unexpectedly. But Carlson said that preventive veterinary care—like vaccination, parasite control and weight management—is "the best way …

工作高效記事軟件是什么 好用的高效記事軟件

陽光斜灑在辦公桌上&#xff0c;我埋頭于一堆雜亂的文件中&#xff0c;頭腦里充斥著各種待辦事項。電話鈴聲突然響起&#xff0c;是老板打來的&#xff0c;提醒我下午三點有個重要會議。掛斷電話后&#xff0c;我趕緊拿起筆想在便簽上記下&#xff0c;卻發現桌面已經被各種便簽…