SQLAlchemy系列教程:如何執行原生SQL

Python中的數據庫交互提供了高級API。但是,有時您可能需要執行原始SQL以提高效率或利用數據庫特定的特性。本指南介紹在SQLAlchemy框架內執行原始SQL。

在SQLAlchemy中執行原生SQL

SQLAlchemy雖然以其對象-關系映射(ORM)功能而聞名,但也允許直接執行原始SQL語句。當您有復雜的查詢、需要優化性能或利用數據庫引擎特有的特性時,這可能是有益的。執行原始SQL為您提供了這樣做的能力和靈活性。

要執行原始SQL,必須使用SQLAlchemy的Connection對象,該對象可以從Engine或Session上下文中獲得。讓我們通過漸進式示例探索在SQLAlchemy中執行原始SQL的一些常見模式。
在這里插入圖片描述

執行簡單SQL

要執行原始SQL,需要從引擎獲得一個連接:

from sqlalchemy import create_engine
# Replace 'dialect+driver://username:password@host/dbname' with your actual database URI
db_engine = create_engine('dialect+driver://username:password@host/dbname')with db_engine.connect() as connection:result = connection.execute("SELECT * FROM my_table")for row in result:print(row)

這將打印出‘ my_table ’表結果集中的每一行。

參數化查詢

出于安全原因和防止SQL注入攻擊,永遠不要簡單地將變量直接插入到SQL字符串中。相反,使用命名參數或位置占位符:

with db_engine.connect() as connection:result = connection.execute("SELECT * FROM users WHERE username = :username", {'username': 'example_user'})user = result.fetchone()print(user)

在上面的示例中,“:username ”是一個占位符,可以被“ example_user ”安全地替換。

使用文本SQL

SQLAlchemy的text函數可以用來創建帶有占位符的SQL表達式:

from sqlalchemy.sql import textsql = text("SELECT * FROM users WHERE username = :username")with db_engine.connect() as connection:result = connection.execute(sql, username='example_user')user = result.fetchone()print(user)

這里,文本函數用命名參數包裝SQL,提供靈活性和注入預防。

執行插入、更新、刪除

INSERT、UPDATE、DELETE等修改操作也可以用類似的方式執行:

# Inserting a new user
insert_sql = text("INSERT INTO users (username, email) VALUES (:username, :email)")with db_engine.connect() as connection:connection.execute(insert_sql, username='new_user', email='new_user@example.com')# Updating a user's email
update_sql = text("UPDATE users SET email = :email WHERE username = :username")with db_engine.connect() as connection:connection.execute(update_sql, email='updated_user@example.com', username='existing_user')# Deleting a user
delete_sql = text("DELETE FROM users WHERE username = :username")with db_engine.connect() as connection:connection.execute(delete_sql, username='obsolete_user')

處理事務

事務處理使用連接對象,在執行SQL語句之前首先開始一個事務。這確保了原子性:

with db_engine.connect() as connection:transaction = connection.begin()try:connection.execute(insert_sql, {...})connection.execute(update_sql, {...})transaction.commit()except:transaction.rollback()raise

這將插入和更新操作包裝在一個事務中,該事務可以在失敗時回滾。

執行存儲過程

存儲過程也可以通過原始SQL調用:

call_procedure_sql = text("CALL my_stored_procedure(:param)")with db_engine.connect() as connection:result = connection.execute(call_procedure_sql, param='value')for row in result:print(row)

使用SQLAlchemy Core進行復雜查詢

除了簡單的文本語句,SQLAlchemy的核心語言還可以將文本SQL與Python邏輯相結合:

from sqlalchemy.sql import select, table, columnt_user = table('users', column('username'), column('email'))
stmt = select([t_user]).where(t_user.c.username == 'example_user')with db_engine.connect() as connection:for row in connection.execute(stmt):print(row)

這個示例演示了如何使用SQLAlchemy Core構造從用戶名匹配“example_user”的“users”表中進行選擇。

訪問本地數據庫功能

最后,使用SQLAlchemy,在需要特定于數據庫功能的情況下,您可以將原始SQL直接傳遞給底層DBAPI連接:

with db_engine.raw_connection() as raw_conn:cursor = raw_conn.cursor()cursor.execute("YOUR_VENDOR_SPECIFIC_SQL_HERE")results = cursor.fetchall()for result in results:print(result)cursor.close()

最后總結

本指南重點介紹了使用SQLAlchemy執行原始SQL的各種方法,從簡單查詢到復雜事務,甚至直接訪問DB API功能。負責任地使用這些方法,始終將查詢參數化以防止SQL注入,并記住盡可能利用SQLAlchemy健壯的ORM特性。

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

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

相關文章

基于SpringBoot的手機銷售網站設計與實現(源碼+SQL腳本+LW+部署講解等)

專注于大學生項目實戰開發,講解,畢業答疑輔導,歡迎高校老師/同行前輩交流合作?。 技術范圍:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:…

瀏覽器安全問題

1. XSS攻擊 概念 XSS 攻擊指的是跨站腳本攻擊,是一種代碼注入攻擊。攻擊者通過在網站注入惡意腳本,使之在用戶的瀏覽器上運行,從而盜取用戶的信息如 cookie 等 XSS本質是因為網站沒有對惡意代碼進行過濾,與正常代碼混合在一起了…

Spring(五)容器-依賴注入的三種方式

目錄 總結:通用的三種注入方式 1 字段注入 2 構造器注入 3 set注入 總結:通用的三種注入方式 優先使用構造器注入謹慎使用 Setter 注入避免濫用字段注入 通過構造器傳入依賴,確保對象創建時即完成初始化。通過 Setter 方法注入依賴&#x…

Python貝殼網二手小區數據爬取(2025年3月更)

文章目錄 一、代碼整體架構解析二、各部分代碼詳解1. main()主函數解析2. 會話初始化(偽裝瀏覽器身份)3. 動態參數生成(反爬蟲核心機制)4. 列表頁抓取(獲取小區列表)5. 列表頁解析(提取小區信息…

使用服務器搭建一個專屬的密碼管理工具Vaultwarden

一、服務器配置與Docker環境 ?實例選型與系統準備? ?推薦配置?:?1核2GB內存?(萊卡云L1型實例),Vaultwarden資源占用低,適合輕量級部署?34。?操作系統?:選擇 ?Ubuntu 22.04 LTS?,兼容…

安孚科技攜手政府產業基金、高能時代發力固態電池,開辟南孚電池發展新賽道

安孚科技出手,發力固態電池。 3月7日晚間,安孚科技(603031.SH)發布公告稱,公司控股子公司南孚電池擬與南平市綠色產業投資基金有限公司(下稱“南平綠色產業基金”)、高能時代(廣東橫…

IO學習---->線程

1.創建兩個線程&#xff0c;分支線程1拷貝文件的前一部分&#xff0c;分支線程2拷貝文件的后一部分 #include <head.h> sem_t sem; long half_size 0; // 全局變量&#xff0c;供所有線程共享void* product(void *arg) {FILE *src fopen("IO.text", "…

深度學習分詞器char-level實戰詳解

一、三種分詞器基本介紹 word-level&#xff1a;將文本按照空格或者標點分割成單詞&#xff0c;但是詞典大小太大 subword-level&#xff1a;詞根分詞&#xff08;主流&#xff09; char-level&#xff1a;將文本按照字母級別分割成token 二、charlevel代碼 導包&#xff1…

基于SpringBoot實現旅游酒店平臺功能六

一、前言介紹&#xff1a; 1.1 項目摘要 隨著社會的快速發展和人民生活水平的不斷提高&#xff0c;旅游已經成為人們休閑娛樂的重要方式之一。人們越來越注重生活的品質和精神文化的追求&#xff0c;旅游需求呈現出爆發式增長。這種增長不僅體現在旅游人數的增加上&#xff0…

git規范提交之commitizen conventional-changelog-cli 安裝

一、引言 使用規范的提交信息可以讓項目更加模塊化、易于維護和理解&#xff0c;同時也便于自動化工具&#xff08;如發布工具或 Changelog 生成器&#xff09;解析和處理提交記錄。 通過編寫符合規范的提交消息&#xff0c;可以讓團隊和協作者更好地理解項目的變更歷史和版本…

前端實現版本更新自動檢測?

&#x1f916; 作者簡介&#xff1a;水煮白菜王&#xff0c;一位資深前端勸退師 &#x1f47b; &#x1f440; 文章專欄&#xff1a; 前端專欄 &#xff0c;記錄一下平時在博客寫作中&#xff0c;總結出的一些開發技巧和知識歸納總結?。 感謝支持&#x1f495;&#x1f495;&a…

硬件基礎(4):(5)設置ADC電壓采集中MCU的參考電壓

Vref 引腳通常是 MCU (特別是帶有 ADC 的微控制器) 上用來提供或接收基準電壓的引腳&#xff0c;ADC 會以該基準電壓作為量程參考對輸入模擬信號進行數字化轉換。具體來說&#xff1a; 命名方式 在不同廠家的 MCU 中&#xff0c;Vref 引腳可能會被標記為 VREF / VREF- / VREF_…

postman接口請求中的 Raw是什么

前言 在現代的網絡開發中&#xff0c;API 的使用已經成為數據交換的核心方式之一。然而&#xff0c;在與 API 打交道時&#xff0c;關于如何發送請求體&#xff08;body&#xff09;內容類型的問題常常困擾著開發者們&#xff0c;尤其是“raw”和“json”這兩個術語之間的區別…

為什么要使用前綴索引,以及建立前綴索引:sql示例

背景&#xff1a; 你想啊&#xff0c;數據庫里有些字段&#xff0c;它老長了&#xff0c;就像那種 varchar(255) 的字段&#xff0c;這玩意兒要是整個字段都拿來建索引&#xff0c;那可太占地方了。打個比方&#xff0c;這就好比你要在一個超級大的筆記本上記東西&#xff0c;每…

【語料數據爬蟲】Python爬蟲|批量采集會議紀要數據(1)

前言 本文是該專欄的第2篇,后面會持續分享Python爬蟲采集各種語料數據的的干貨知識,值得關注。 在本文中,筆者將主要來介紹基于Python,來實現批量采集“會議紀要”數據。同時,本文也是采集“會議紀要”數據系列的第1篇。 采集相關數據的具體細節部分以及詳細思路邏輯,筆…

Android 線程池實戰指南:高效管理多線程任務

在 Android 開發中&#xff0c;線程池的使用非常重要&#xff0c;尤其是在需要處理大量異步任務時。線程池可以有效地管理線程資源&#xff0c;避免頻繁創建和銷毀線程帶來的性能開銷。以下是線程池的使用方法和最佳實踐。 1. 線程池的基本使用 &#xff08;1&#xff09;創建線…

SQL29 計算用戶的平均次日留存率

SQL29 計算用戶的平均次日留存率 計算用戶的平均次日留存率_牛客題霸_牛客網 題目&#xff1a;現在運營想要查看用戶在某天刷題后第二天還會再來刷題的留存率。 示例&#xff1a;question_practice_detail -- 輸入&#xff1a; DROP TABLE IF EXISTS question_practice_detai…

深度學習分類回歸(衣帽數據集)

一、步驟 1 加載數據集fashion_minst 2 搭建class NeuralNetwork模型 3 設置損失函數&#xff0c;優化器 4 編寫評估函數 5 編寫訓練函數 6 開始訓練 7 繪制損失&#xff0c;準確率曲線 二、代碼 導包&#xff0c;打印版本號&#xff1a; import matplotlib as mpl im…

【leetcode hot 100 19】刪除鏈表的第N個節點

解法一&#xff1a;將ListNode放入ArrayList中&#xff0c;要刪除的元素為num list.size()-n。如果num 0則將頭節點刪除&#xff1b;否則利用num-1個元素的next刪除第num個元素。 /*** Definition for singly-linked list.* public class ListNode {* int val;* Lis…

【iOS逆向與安全】sms短信轉發插件與上傳服務器開發

一、目標 一步步分析并編寫一個短信自動轉發的deb插件 二、工具 mac系統已越獄iOS設備:脫殼及frida調試IDA Pro:靜態分析測試設備:iphone6s-ios14.1.1三、步驟 1、守護進程 ? 守護進程(daemon)是一類在后臺運行的特殊進程,用于執行特定的系統任務。例如:推送服務、人…