放棄原生SQL:Python中更優雅的數據庫操作


概要

在Python中,通過原生SQL語句進行數據庫操作是一種傳統的方式,但現代的Python開發中,使用ORM(Object-Relational Mapping)工具和數據庫連接庫可以更加高效和優雅地進行增刪改查操作。本文將詳細介紹Python中放棄原生SQL的理由,并演示使用ORM和數據庫連接庫的豐富示例代碼,助你更好地理解和應用這些技術。


1. ORM的優勢

ORM工具,提供了將數據庫表映射為Python對象的功能。這種方式的優勢在于:

1.1 面向對象

ORM允許開發者使用面向對象的方式來表示和操作數據庫表,使得代碼更加直觀、易讀、易維護。

#?使用SQLAlchemy定義一個User模型
from?sqlalchemy?import?create_engine,?Column,?Integer,?String,?Sequence
from?sqlalchemy.ext.declarative?import?declarative_baseBase?=?declarative_base()class?User(Base):__tablename__?=?'users'id?=?Column(Integer,?Sequence('user_id_seq'),?primary_key=True)name?=?Column(String(50))age?=?Column(Integer)

1.2 避免SQL注入

ORM工具通常會使用參數化查詢,避免了SQL注入的風險。

#?使用SQLAlchemy進行查詢
user_id?=?1
result?=?session.query(User).filter_by(id=user_id).first()

2. 使用SQLAlchemy進行數據庫操作

2.1 增加數據

#?添加新用戶
new_user?=?User(name='John?Doe',?age=30)
session.add(new_user)
session.commit()

2.2 查詢數據

#?查詢所有用戶
users?=?session.query(User).all()
for?user?in?users:print(f"ID:?{user.id},?Name:?{user.name},?Age:?{user.age}")

2.3 更新數據

#?更新用戶信息
user_to_update?=?session.query(User).filter_by(id=1).first()
user_to_update.age?=?31
session.commit()

2.4 刪除數據

#?刪除用戶
user_to_delete?=?session.query(User).filter_by(id=1).first()
session.delete(user_to_delete)
session.commit()

3. 使用數據庫連接庫進行操作

除了ORM,數據庫連接庫(如psycopg2mysql-connector-python等)也提供了直接執行SQL語句的方式。

import?psycopg2#?連接到PostgreSQL數據庫
conn?=?psycopg2.connect(host="your_host",database="your_database",user="your_user",password="your_password"
)#?創建游標對象
cursor?=?conn.cursor()#?執行SQL查詢
cursor.execute("SELECT?*?FROM?users;")
records?=?cursor.fetchall()
for?record?in?records:print(record)#?關閉游標和連接
cursor.close()
conn.close()

4. 使用Django ORM進行數據庫操作

對于Django開發者,Django ORM是一個強大而靈活的工具,與Django框架深度整合。以下是Django ORM的示例代碼:

4.1 增加數據

#?定義一個模型
from?django.db?import?modelsclass?Author(models.Model):name?=?models.CharField(max_length=100)age?=?models.IntegerField()#?創建并保存新作者
new_author?=?Author(name='Jane?Doe',?age=25)
new_author.save()

4.2 查詢數據

#?查詢所有作者
authors?=?Author.objects.all()
for?author?in?authors:print(f"ID:?{author.id},?Name:?{author.name},?Age:?{author.age}")

4.3 更新數據

#?更新作者信息
author_to_update?=?Author.objects.get(id=1)
author_to_update.age?=?26
author_to_update.save()

4.4 刪除數據

#?刪除作者
author_to_delete?=?Author.objects.get(id=1)
author_to_delete.delete()

選擇適當的數據庫操作方式

在實際項目中,選擇使用ORM還是直接使用數據庫連接庫取決于多個因素。如果項目使用了Django框架,或者你更傾向于面向對象的編程方式,Django ORM是一個優秀的選擇。對于其他項目,使用SQLAlchemy等獨立的ORM工具或直接的數據庫連接庫也能提供靈活性和性能。

總體而言,選擇更加符合項目需求的方式,有助于提高代碼的可讀性、可維護性和執行效率。在實際開發中,可以根據項目的規模、復雜性和團隊的熟悉程度來綜合考慮。希望本文提供的示例代碼和討論對你更好地理解和選擇Python中數據庫操作的方式有所幫助。

總結

本文詳細介紹了在Python中放棄原生SQL的優勢,并通過SQLAlchemy的ORM工具和數據庫連接庫展示了更為優雅和高效的數據庫操作方式。使用ORM工具可以使代碼更加面向對象,避免了SQL注入的風險,而數據庫連接庫則提供了更直接的SQL語句執行方式。在實際開發中,選擇適合項目需求的方式,既可以保證代碼的可讀性和維護性,又能有效地進行數據庫操作。

通過深入理解和實踐這些數據庫操作方式,更加游刃有余地處理各種數據庫任務,提高開發效率。希望本文對你在Python中選擇更合適的數據庫操作方式有所啟發。

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

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

相關文章

解決IDEA中多個項目不在同一窗口下顯示的問題和添加新的git的URL

以上是添加顯示多個項目 以下是給新添加的項目添加git

LeetCode算法題解(單調棧)|LeetCode84. 柱狀圖中最大的矩形

一、LeetCode84. 柱狀圖中最大的矩形 題目鏈接:84. 柱狀圖中最大的矩形 題目描述: 給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。 求在該柱狀圖中,能夠勾勒出來的矩形的最大…

做外貿很多時候還是要學會隨機應變

馬上又要到年底了,相信已經有一部分小伙伴開啟了催單模式,希望客戶盡量在春節前將訂單落實下來,自然也有很多客戶會在春節前的這一段時間開始陸續拜訪自己觀望了很久的工廠。 其實對于貿易公司來說,對于來看工廠的客戶&#xff0…

ChatGPT,作為一種強大的自然語言處理模型,具備顯著優勢,能夠幫助您在各個領域取得突破

2023年隨著OpenAI開發者大會的召開,最重磅更新當屬GPTs,多模態API,未來自定義專屬的GPT。微軟創始人比爾蓋茨稱ChatGPT的出現有著重大歷史意義,不亞于互聯網和個人電腦的問世。360創始人周鴻祎認為未來各行各業如果不能搭上這班車…

Kotlin 作用域函數:理解 apply, let, 和 with

Kotlin提供了幾個作用域函數來優化和簡化代碼的結構。 本文將對比分析 apply, let, 和 with 三個函數。 一、對比分析: apply:在其接收者的上下文中執行代碼塊,并返回接收者對象。let:在其接收者的上下文中執行代碼塊&#xff…

Kotlin:內置函數let、also、with、run、apply

前言 在Kotlin中,有一些用于擴展 & 方便開發者編碼的內置函數,能大大提高開發者的開發效率。今天,我將主要講解的是: let函數also函數with函數run函數apply函數 基礎知識:接口回調中Lambda使用 在Kotlin中可使用…

棧和隊列的互相實現

用隊列實現棧 OJ鏈接 請你僅使用兩個隊列實現一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作(push、top、pop 和 empty)。 實現 MyStack 類: void push(int x) 將元素 x 壓入棧頂。int pop() 移除并返…

Mybatis XML增刪操作(結合上文)

先來"增"操作 在UserInfoXMLMapper.xml里面寫 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <…

nginx多端口部署

1.配置nginx.conf文件 有幾個端口需要部署就寫幾個server&#xff0c;我這里只部署了兩個端口分別為80和81端口&#xff0c;所以有兩個server文件。80端口項目入口在根目錄的test文件中&#xff0c;81端口項目入口在根目錄的test1文件夾中。 2.準備項目文件html文件 在/test1…

Dockerfile部署Java項目掛載使用外部配置文件

Dockerfile部署Java項目掛載使用外部配置文件 技術博客 http://idea.coderyj.com/ 需求是由于java項目使用的是nacos 而且每次部署nacos服務器ip不一樣導致要重新打包,想引入外部配置文件進行打包 1.需求是由于java項目使用的是nacos 而且每次部署nacos服務器ip不一樣導致要重新…

數據結構和算法專題---5、調度算法與應用

本章我們會對調度算法做個簡單介紹&#xff0c;包括常用的調度算法&#xff08;FCFS、SJF、RR、HPF&#xff09;的概述、實現方式、典型場景做個說明。 什么是調度算法 調度算法常見于操作系統中&#xff0c;因為系統資源有限&#xff0c;當有多個進程&#xff08;或多個進程…

Oracle 怎樣修改DB_NAME

DBNEWID 是一個數據庫實用程序&#xff0c;用于更改 Oracle 數據庫的 DBNAME 和 DBID。可以更改 DBID 或 DBNAME 或兩者。 DBNAME 是在創建數據庫時指定的數據庫名稱&#xff0c;DBID 是創建數據庫時分配給數據庫的唯一編號。 以下步驟演示如何使用 DBNEWID 實用程序更改 Oracl…

【論文閱讀筆記】序列數據的數據增強方法綜述

【論文閱讀筆記】序列數據的數據增強方法綜述 摘要 這篇論文探討了在深度學習模型中由于對精度的要求不斷提高導致模型框架結構變得更加復雜和深層的趨勢。隨著模型參數量的增加&#xff0c;訓練模型需要更多的數據&#xff0c;但人工標注數據的成本高昂&#xff0c;且由于客觀…

將RK3399的挖掘機開發板在Android10下設置系統默認為24小時制

將RK3399的挖掘機開發板在Android10下設置系統默認為24小時制 2023/12/9 22:07 應該也可以適用于RK3399的Android12系統 --- a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/frameworks/base/packages/SettingsProvider/res/values/defaults.xml -2…

MagicAnimate

簡介 新加坡國立大學 Show 實驗室和字節聯合做了一項類似的研究。他們提出了一個基于擴散的框架 MagicAnimate&#xff0c;旨在增強時間一致性、忠實地保留參考圖像并提升動畫保真度。并且&#xff0c;MagicAnimate 項目是開源的&#xff0c;目前推理代碼和 gradio 在線 demo …

python程序大全(9)——鼠標亂動惡搞小病毒(有資源)

目錄 &#x1f3c6;一、前言 &#x1f3c6;二、程序第一版 &#x1f3c6;三、程序大魔改 &#x1f6a9;1、基礎改動 &#x1f6a9;2、打包 &#x1f6a9;3、F12保護機制 &#x1f6a9;4、添加開機自啟項 &#x1f6a9;5、自己也不懂的線程魔改 &#x1f3c6;四、最終代碼 &…

排列游戲 --- 動態規劃 --- 題解

目錄 排列游戲 題目描述 輸入描述: 輸出描述: 輸入 輸出 備注: 思路&#xff1a; 代碼&#xff1a; 排列游戲 K-排列游戲_牛客競賽動態規劃專題班習題課 (nowcoder.com) 時間限制&#xff1a;C/C 1秒&#xff0c;其他語言2秒 空間限制&#xff1a;C/C 262144K&#…

外包干了三年,我承認我確實廢了……

沒錯&#xff0c;我也干過外包&#xff0c;一干就是三年&#xff0c;三年后&#xff0c;我廢了…… 雖說廢的不是很徹底&#xff0c;但那三年我幾乎是出差了三年、玩了三年、荒廢了三年&#xff0c;那三年&#xff0c;我的技術能力幾乎是零成長的。 說起這段三年的外包經歷&a…

vue中滾輪縮放事件

在Vue中&#xff0c;可以使用原生JS的滾輪事件監聽來實現滾輪縮放&#xff1a; 首先在模板中給需要監聽滾輪事件的元素添加一個ref屬性&#xff0c;用于在Vue中獲取元素節點。 <template><div ref"scale"><!-- 需要縮放的內容 --></div> &…

Ubuntu中編譯出Windows的可執行程序(.exe)

1、前言 在嵌入式開發中&#xff0c;交叉編譯是很常見的情況&#xff0c;如果你把Windows電腦也看做一塊高性能的開發板&#xff0c;那在Ubuntu中編譯出Windows上運行的可執行程序也是很好理解的行為。 2、安裝mingw64環境 sudo apt-get install mingw-w64 3、測試編譯鏈是否安…