解析 SQL,就用 sqlparse!

文章目錄

  • 解析 SQL,就用 sqlparse!
    • 一、背景:為什么你需要 sqlparse?
    • 二、什么是 sqlparse?
    • 三、如何安裝 sqlparse?
    • 四、簡單易用的庫函數
      • 1\. `parse(sql)`
      • 2\. `format(sql, **options)`
      • 3\. `split(sql)`
      • 4\. `get_type()`
      • 5\. `flatten()`
    • 五、實用場景與代碼示例
      • 場景 1:提取表名
      • 場景 2:格式化多條 SQL 語句
      • 場景 3:修改 SQL 語句
      • 場景 4:提取查詢字段
      • 場景 5:自定義插件
    • 六、常見問題及解決方案
      • 問題

在這里插入圖片描述

解析 SQL,就用 sqlparse!

一、背景:為什么你需要 sqlparse?

在開發中,SQL 語句的處理常常是一個讓人頭疼的問題。無論是復雜的查詢語句,還是多條 SQL 的批量處理,手動解析和格式化不僅費時費力,還容易出錯。而
sqlparse 正是為了解決這些問題而生。它是一個強大的 Python 第三方庫,能夠幫助開發者輕松解析、格式化和操作 SQL
語句。接下來,我們將深入了解這個庫的強大功能。

二、什么是 sqlparse?

sqlparse 是一個非驗證性的 SQL 解析器模塊,它支持解析、分割和格式化 SQL 語句。它不驗證 SQL 的語法是否正確,但可以將 SQL
語句分解為結構化的對象,方便開發者進行進一步的操作。

三、如何安裝 sqlparse?

作為第三方庫,sqlparse 可以通過 pip 命令輕松安裝:

bash復制

pip install sqlparse

安裝完成后,你就可以在 Python 代碼中導入并使用它。

四、簡單易用的庫函數

以下是 sqlparse 中常用的五個函數及其使用方法:

1. parse(sql)

用于解析 SQL 語句,返回一個包含解析結果的對象列表。

Python復制

import sqlparsesql = "SELECT * FROM users WHERE id = 1;"
parsed = sqlparse.parse(sql)
print(parsed)
  • sqlparse.parse(sql):將 SQL 字符串解析為一個對象列表,每個對象代表一條 SQL 語句。

2. format(sql, **options)

用于格式化 SQL 語句,使其更易讀。

Python復制

sql = "SELECT * FROM users WHERE id = 1;"
formatted_sql = sqlparse.format(sql, reindent=True, keyword_case='upper')
print(formatted_sql)
  • reindent=True:重新縮進 SQL 語句。

  • keyword_case='upper':將關鍵字轉換為大寫。

3. split(sql)

將包含多條 SQL 語句的字符串分割為單獨的語句。

Python復制

multi_sql = "SELECT * FROM users; SELECT * FROM orders;"
statements = sqlparse.split(multi_sql)
print(statements)
  • sqlparse.split(sql):將多條 SQL 語句分割為列表。

4. get_type()

獲取 SQL 語句的類型(如 SELECT、INSERT 等)。

Python復制

parsed = sqlparse.parse(sql)[0]
query_type = parsed.get_type()
print(query_type)
  • parsed.get_type():返回當前 SQL 語句的類型。

5. flatten()

用于遞歸解析子組,獲取所有 Token。

Python復制

parsed = sqlparse.parse(sql)[0]
for token in parsed.flatten():print(token)
  • parsed.flatten():遞歸解析 SQL 語句中的所有 Token。

五、實用場景與代碼示例

以下是 sqlparse 在不同場景中的應用示例:

場景 1:提取表名

Python復制

sql = "SELECT * FROM users WHERE id = 1;"
parsed = sqlparse.parse(sql)[0]
for token in parsed.tokens:if isinstance(token, sqlparse.sql.Identifier):print("表名:", token.get_real_name())
  • 通過 Identifier 類提取 SQL 語句中的表名。

場景 2:格式化多條 SQL 語句

Python復制

multi_sql = "SELECT * FROM users; SELECT * FROM orders;"
statements = sqlparse.split(multi_sql)
for stmt in statements:formatted_sql = sqlparse.format(stmt, reindent=True, keyword_case='upper')print(formatted_sql)
  • 使用 split()format() 方法對多條 SQL 語句進行格式化。

場景 3:修改 SQL 語句

Python復制

sql = "SELECT * FROM users WHERE id = 1;"
parsed = sqlparse.parse(sql)[0]
for token in parsed.tokens:if token.ttype is sqlparse.tokens.Name:token.value = 'customers'
print(parsed)
  • 修改 SQL 語句中的表名。

場景 4:提取查詢字段

Python復制

sql = "SELECT name, age FROM users WHERE id = 1;"
parsed = sqlparse.parse(sql)[0]
fields = []
for token in parsed.tokens:if isinstance(token, sqlparse.sql.IdentifierList):for identifier in token.get_identifiers():fields.append(identifier.value)
print("字段列表:", fields)
  • 提取 SELECT 語句中的字段。

場景 5:自定義插件

Python復制

class UppercaseFilter(sqlparse.filters.Filter):def process(self, stream):for token in stream:if token.ttype is sqlparse.tokens.Keyword:token.value = token.value.upper()yield tokensql = "select * from users where id = 1;"
formatted_sql = sqlparse.format(sql, reindent=True, keyword_case='upper', filters=[UppercaseFilter()])
print(formatted_sql)
  • 使用自定義插件將關鍵字轉換為大寫。

六、常見問題及解決方案

以下是使用 sqlparse 時常見的三個問題及解決方法:

問題

如果你覺得文章還不錯,請大家 點贊、分享、留言 下,因為這將是我持續輸出更多優質文章的最強動力!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71608.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71608.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71608.shtml

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

相關文章

點云軟件VeloView開發環境搭建與編譯

官方編譯說明 LidarView / LidarView-Superbuild GitLab 我的編譯過程: 安裝vs2019,windows sdk,qt5.14.2(沒安裝到5.15.7),git,cmake3.31,python3.7.9,ninja下載放到…

【一文學會 HTML5】

目錄 HTML概述基本概念HTML 發展歷程HTML 基本結構 網頁基本標簽標題標簽&#xff08;<h1> - <h6>&#xff09;段落標簽&#xff08;<p>&#xff09;換行標簽&#xff08;<br>&#xff09;水平線標簽&#xff08;<hr>&#xff09;注釋&#xff0…

Spring Boot面試問答

1. Spring Boot 基礎知識 問題 1:什么是Spring Boot?它與Spring框架有何不同? 回答: Spring Boot是基于Spring框架的一個開源框架,旨在簡化新Spring應用的初始化和開發過程。與傳統的Spring框架相比,Spring Boot提供了以下優勢: 自動配置:根據項目依賴自動配置Spring…

DeepSeek系列模型技術報告的閱讀筆記

DeepSeek系列模型技術報告的閱讀筆記 之前仔細閱讀了DeepSeek系列模型的主要技術方面內容與發展脈絡&#xff0c;以下是DeepSeek系列模型技術報告的筆記&#xff0c;有錯誤的地方歡迎指正&#xff01; 文章目錄 DeepSeek系列模型技術報告的閱讀筆記GQADeepseek MoEAbstractIn…

MyBatis @Param 注解詳解:多參數傳遞與正確使用方式

Param 注解主要用于 MyBatis 進行參數傳遞時給 SQL 語句中的參數 起別名&#xff0c;通常用于 多參數 方法&#xff0c;使參數在 XML Mapper 文件或注解 SQL 語句中更清晰易用。 1. 基本用法 在 Mapper 接口中使用 Param 來為參數命名&#xff0c;避免 MyBatis 解析時出現參數…

OpenBMC:BmcWeb connect讀取http請求

OpenBMC:BmcWeb構造connect對象-CSDN博客 OpenBMC:BmcWeb server.run-CSDN博客 1.構造了connect對象后,通過connection->start()開始處理來自客戶端的請求 //http\http_connection.hpp void start() {...startDeadline();readClientIp();boost::beast::async_detect_ssl…

SparkStreaming之04:調優

SparkStreaming調優 一 、要點 4.1 SparkStreaming運行原理 深入理解 4.2 調優策略 4.2.1 調整BlockReceiver的數量 案例演示&#xff1a; object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…

軟考初級程序員知識點匯總

以下是計算機技術與軟件專業技術資格&#xff08;水平&#xff09;考試&#xff08;簡稱“軟考”&#xff09;中 程序員&#xff08;初級&#xff09; 考試的核心知識點匯總&#xff0c;涵蓋考試大綱的主要方向&#xff0c;幫助你系統復習&#xff1a; 一、計算機基礎 計算機組…

Gauss數據庫omm用戶無法連接處理

確保gauss數據庫服務已經打開 重啟gauss服務 gs_om -t restart 連接gauss gsql -d postgres -p 26000 -r 結果發現 查看數據庫運行情況 gs_om -t status --detail 我們可以看到 cluster_state 的值是 Unavailable 不可用 那么問題大概率是出現在了這里 然后我們再查看一…

36-Openwrt wifi命令工具iwconfig、iwinfo、iwpriv、iwlist

增對wifi的調試命令有很多,這邊列出我們常用的命令提供參考,方便查看信息定位問題。 1、iwconfig 查看當前 WIFI 的工作信道以及工作帶寬模式: root@openwrt:/# iwconfig ra0 ra0 mt7603e ESSID:"openwrt" Mode:Managed Channel:8 Access Point: DC:4B…

Android 低功率藍牙之BluetoothGattDescriptor詳解

BluetoothGattDescriptor 詳解 BluetoothGattDescriptor 是 Android 中用于表示藍牙低功耗&#xff08;BLE&#xff09;設備中 GATT&#xff08;Generic Attribute Profile&#xff09;描述符 的類。描述符是 GATT 架構中的一種屬性&#xff0c;用于提供關于 特征值&#xff0…

計算機畢業設計Python+DeepSeek-R1大模型醫療問答系統 知識圖譜健康膳食推薦系統 食譜推薦系統 醫療大數據(源碼+LW文檔+PPT+講解)

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

數字體驗推薦TOP8提升用戶參與

數字內容體驗推薦核心優勢 在數字化競爭日益激烈的市場環境中&#xff0c;數字內容體驗的差異化優勢已成為企業突圍的關鍵。通過智能算法驅動的個性化推薦系統&#xff0c;能夠精準捕捉用戶行為軌跡與興趣偏好&#xff0c;實現內容與受眾的動態匹配。這種技術不僅顯著提升頁面…

【每日學點HarmonyOS Next知識】動圖循環播放、監聽tab切換、富文本上下滾動、tab默認居中、a標簽喚起撥號

1、image加載網絡動圖播放一遍后不再播放,有什么方法可以 設置循環播放 目前ArkUI不支持gif圖片設置輪播次數&#xff0c;可通過三方庫ohos-gif-drawable設置輪播次數&#xff0c;在播放一次結束后的回調方法getLoopFinish()中更新播放次數&#xff0c;達到指定次數后設置播放…

redis數據遷移教程(使用RedisShake實現不停機遷移十分便捷)

1.我的場景 需要把本地的redis數據上傳到阿里云服務器上面,服務器上redis并沒有開aof持久化,但是將rdb文件上傳至服務器后每次重啟redis,rdb文件會被覆蓋導致無法同同步數據,最終決定使用RedisShake 2.RedisShake介紹 什么是 RedisShake? RedisShake 是一個用于處理和遷移…

C語言_數據結構總結4:不帶頭結點的單鏈表

純C語言代碼&#xff0c;不涉及C 0. 結點結構 typedef int ElemType; typedef struct LNode { ElemType data; //數據域 struct LNode* next; //指針域 }LNode, * LinkList; 1. 初始化 不帶頭結點的初始化&#xff0c;即只需將頭指針初始化為NULL即可 void Init…

78.StringBuilder簡單示例 C#例子 WPF例子

利用 StringBuilder 提升字符串操作性能 在 C# 中&#xff0c;字符串是不可變的&#xff0c;這意味著每次修改字符串時都會創建一個新的對象。這種特性雖然保證了安全性&#xff0c;但在頻繁修改字符串的場景中會導致性能問題。StringBuilder 正是為解決這一問題而設計的。 什…

【數據集】社區天氣資訊網絡CoWIN-香港小時尺度氣象數據(含MATLAB處理代碼)

社區天氣資訊網絡CoWIN-香港小時尺度氣象數據 數據概述氣象變量說明數據提取(MATLAB全代碼)輸出WRF所需站點氣溫數據參考數據概述 官網-Community Weather Information Network (CoWIN) data policy CoWIN 提供 2010 - 2024 年 的數據下載,每年數據均可單獨下載。下載數據…

【JAVA架構師成長之路】【Redis】第14集:Redis緩存穿透原理、規避、解決方案

30分鐘自學教程&#xff1a;Redis緩存穿透原理與解決方案 目標 理解緩存穿透的成因及危害。掌握布隆過濾器、空值緩存等核心防御技術。能夠通過代碼實現請求攔截與緩存保護。學會限流降級、異步加載等應急方案。 教程內容 0~2分鐘&#xff1a;緩存穿透的定義與核心原因 定義…

尚硅谷爬蟲note15

一、當當網 1. 保存數據 數據交給pipelines保存 items中的類名&#xff1a; DemoNddwItem class DemoNddwItem(scrapy.Item): 變量名 類名&#xff08;&#xff09; book DemoNddwItem(src src, name name, price price)導入&#xff1a; from 項目名.items import 類…