国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用SQLAlchemy實(shí)施ORM數(shù)據(jù)模型 - 優(yōu)化數(shù)據(jù)庫(kù)操作

使用 SQLAlchemy 強(qiáng)大的 ORM 處理應(yīng)用程序的數(shù)據(jù)層。純粹用 Python 定義數(shù)據(jù)模型、添加/刪除記錄以及執(zhí)行查詢(xún)。

使用 ORM 作為數(shù)據(jù)層是一個(gè)與面向?qū)ο缶幊瘫旧硪粯庸爬系母拍?。通過(guò)抽象 SQL 概念,開(kāi)發(fā)人員可以通過(guò)修改對(duì)象而不是查詢(xún)來(lái)避免可怕的“上下文切換”。ORM 不僅僅是過(guò)度熱衷的 OOP 時(shí)代慢慢衰落的產(chǎn)物;它也是 OOP 時(shí)代的產(chǎn)物。它們通過(guò)確保應(yīng)用程序端的數(shù)據(jù)完整性來(lái)保證一定程度的持久性,從而最大限度地減少災(zāi)難性 SQL 查詢(xún)的可能性。

ORM 允許開(kāi)發(fā)人員通過(guò)修改代碼中的對(duì)象(數(shù)據(jù)類(lèi))來(lái)處理數(shù)據(jù),而不是對(duì)數(shù)據(jù)庫(kù)執(zhí)行 SQL 查詢(xún)。此工作流程對(duì)于定期驗(yàn)證和修改數(shù)據(jù)(例如驗(yàn)證用戶(hù)、修改配置文件、發(fā)布內(nèi)容等)的面向用戶(hù)的應(yīng)用程序是有好處的。ORM 的亮點(diǎn)在于提供了一個(gè)用于處理頻繁且可預(yù)測(cè)的操作的接口;這對(duì)于應(yīng)用程序開(kāi)發(fā)至關(guān)重要,但對(duì)于涉及數(shù)據(jù)分析的任何事情來(lái)說(shuō)肯定是一種負(fù)擔(dān)。

創(chuàng)建模型

數(shù)據(jù)模型是代表數(shù)據(jù)庫(kù)中 SQL 表的 Python 類(lèi),其中模型的屬性轉(zhuǎn)換為表中的列。

使用 ORM 時(shí),創(chuàng)建模型實(shí)例會(huì)轉(zhuǎn)化為在 SQL表中創(chuàng)建行。當(dāng)然,這意味著我們需要先定義模型,然后才能編寫(xiě)任何有意義的業(yè)務(wù)邏輯。

我們通過(guò)定義 Python 類(lèi)來(lái)創(chuàng)建模型,這些類(lèi)擴(kuò)展了 SQLAlchemy 中稱(chēng)為declarative_base(). 我們這樣定義模型“基礎(chǔ)”對(duì)象:

"""SQLAlchemy 數(shù)據(jù)模型。"""
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

現(xiàn)在我們可以擴(kuò)展Base以創(chuàng)建我們的第一個(gè)模型。按照傳統(tǒng),我們的第一個(gè)模型將是一個(gè)代表用戶(hù)帳戶(hù)的模型,恰當(dāng)?shù)孛麨閁ser。我們將從簡(jiǎn)單開(kāi)始:

"""SQLAlchemy 數(shù)據(jù)模型。"""
from sqlalchemy import Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.types import Integer, Text, String


Base = declarative_base()


class User(Base):
    """User account."""

    __tablename__ = "user"

    id = Column(Integer, primary_key=True, autoincrement="auto")
    username = Column(String(255), unique=True, nullable=False)
    password = Column(Text, nullable=False)

雖然上面的 Python 類(lèi)可能是準(zhǔn)系統(tǒng),但它是一個(gè)完全有效的數(shù)據(jù)模型,它將生成一個(gè)包含三列(每個(gè)屬性一列)的表:id、username和password。這些屬性中的每一個(gè)都具有類(lèi)型Column(),這是 SQLAlchemy 獨(dú)有的數(shù)據(jù)結(jié)構(gòu)(因此我們包含from sqlalchemy import Column)。

我們還導(dǎo)入了三個(gè) SQLAlchemy“類(lèi)型”,我們看到它們被傳遞到每個(gè)Column. 每種類(lèi)型對(duì)應(yīng)一個(gè) SQL 數(shù)據(jù)類(lèi)型。因此,我們的 SQL 表列的數(shù)據(jù)類(lèi)型將分別是integer、varchar(255)和text。

Columns 還可以接受鍵或列約束等可選參數(shù):

  • Primary_key:將列指定為表的“主鍵”,這是強(qiáng)烈推薦的做法,它充當(dāng)唯一標(biāo)識(shí)符以及 SQL 搜索的索引。

  • 自動(dòng)增量primary_key:僅與類(lèi)型為 且具有類(lèi)型的列相關(guān)Integer。我們創(chuàng)建的每個(gè)用戶(hù)都會(huì)自動(dòng)分配一個(gè) id,其中第一個(gè)用戶(hù)的 id 為1,后續(xù)用戶(hù)的 id 會(huì)相應(yīng)增加。

  • unique:放置一個(gè)約束,其中沒(méi)有兩個(gè)記錄/行共享給定列的相同值(我們不希望兩個(gè)用戶(hù)具有相同的用戶(hù)名)。

  • nullable:當(dāng)設(shè)置為 時(shí)True,會(huì)添加一個(gè)約束,即該列是必需的,除非提供值,否則不會(huì)創(chuàng)建任何行。

  • key:在給定列上放置輔助鍵,通常與另一個(gè)約束(例如“索引”)一起使用。

  • index:指定列的值可以以非任意方式排序,以提高查詢(xún)性能

  • server_default:如果未顯式傳遞值,則分配默認(rèn)值。

在我們的示例中,我們?cè)O(shè)置可選屬性__tablename__來(lái)顯式指定應(yīng)命名哪個(gè)模型的相應(yīng) SQL 表。如果不存在,SQL 將使用類(lèi)的名稱(chēng)來(lái)創(chuàng)建表。

有了所有這些知識(shí),我們可以繼續(xù)構(gòu)建我們的模型:

...
from sqlalchemy.types import Integer, Text, String, DateTime
from sqlalchemy.sql import func


class User(Base):
    """User account."""

    __tablename__ = "user"

    id = Column(Integer, primary_key=True, autoincrement="auto")
    username = Column(String(255), unique=True, nullable=False)
    password = Column(Text, nullable=False)
    email = Column(String(255), unique=True, nullable=False)
    first_name = Column(String(255))
    last_name = Column(String(255))
    bio = Column(Text)
    avatar_url = Column(Text)
    created_at = Column(DateTime, server_default=func.now())
    updated_at = Column(DateTime, server_default=func.now())

    def __repr__(self):
        return f"<User {self.username}>"

現(xiàn)在這是一個(gè)模型!我們?cè)谀P椭刑砑恿艘恍傩?,每個(gè)屬性都是不言自明的。和列演示了如何使用 SQLAlchemycreated_at函數(shù)updated_at自動(dòng)分配這些值。

最佳實(shí)踐是設(shè)置__repr__數(shù)據(jù)模型(以及一般的 Python 類(lèi))的值,以便記錄或調(diào)試我們的類(lèi)實(shí)例。返回的值是我們?cè)诘膶?shí)例__repr__時(shí)看到的值。如果您曾經(jīng)不得不使用Javascript 進(jìn)行處理,那么您已經(jīng)熟悉了調(diào)試對(duì)象的值卻得不到任何有用的回報(bào)是多么令人討厭。print()User[object Object]

我們的模型看起來(lái)不錯(cuò),所以讓我們用它創(chuàng)建一個(gè) SQL 表。create_tables()我們通過(guò)調(diào)用創(chuàng)建模型后調(diào)用的方法來(lái)做到這一點(diǎn):

從擴(kuò)展的類(lèi)創(chuàng)建 SQL 表Base:

Base.metadata.create_all(engine)

一旦運(yùn)行,SQLAlchemy 就會(huì)處理數(shù)據(jù)庫(kù)端的所有事情,以創(chuàng)建與我們的模型匹配的表。如果您好奇,這就是我們的User模型輸出的內(nèi)容:

用于根據(jù)我們的數(shù)據(jù)模型創(chuàng)建表的 SQL 語(yǔ)句:

CREATE TABLE "user" (
  "id" int NOT NULL AUTO_INCREMENT,
  "username" varchar(255) NOT NULL,
  "password" text NOT NULL,
  "email" varchar(255) NOT NULL,
  "first_name" varchar(255) DEFAULT NULL,
  "last_name" varchar(255) DEFAULT NULL,
  "bio" text,
  "avatar_url" text,
  "last_seen" datetime DEFAULT NULL,
  "created_at" datetime DEFAULT CURRENT_TIMESTAMP,
  "updated_at" datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY ("id"),
  UNIQUE KEY "username" ("username"),
  UNIQUE KEY "email" ("email"));

創(chuàng)建會(huì)話

會(huì)話是一種持久的數(shù)據(jù)庫(kù)連接,可讓我們輕松添加、刪除、更改甚至撤消更改。我們將使用User剛剛創(chuàng)建的模型通過(guò)數(shù)據(jù)庫(kù)會(huì)話創(chuàng)建新用戶(hù)。

會(huì)話是通過(guò)將它們綁定到 SQLAlchemy 引擎來(lái)創(chuàng)建的,我們?cè)诒鞠盗械牡?1 部分中介紹了該引擎。創(chuàng)建引擎后,我們所需要做的就是使用 SQLAlchemysessionmaker定義會(huì)話并將其綁定到我們的引擎:

"""數(shù)據(jù)庫(kù)引擎和會(huì)話創(chuàng)建。"""
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker


engine = create_engine(
    'mysql+pymysql://user:password@host:3600/database',
    echo=True
)
Session = sessionmaker(bind=engine)
session = Session()

這就是所需要的一切!我們將session與我們的模型一起使用User來(lái)創(chuàng)建一些用戶(hù)。

使用模型和會(huì)話創(chuàng)建記錄

定義模型并創(chuàng)建會(huì)話后,我們可以純粹使用 Python 添加和修改數(shù)據(jù)。SQLAlchemy 將此稱(chēng)為基于函數(shù)的查詢(xún)構(gòu)造。讓我們看看從我們的類(lèi)中創(chuàng)建一個(gè)新用戶(hù)需要做什么User:

from models import User
from database import session


user = User(
    username="admin",
    password="Please don't set passwords like this",
    email="admin@example.com",
    first_name="Todd",
    last_name="Birchard",
    bio="I write tutorials on the internet.",
    avatar_url="https://example.com/avatar.jpg"
)

session.add(user)  # 添加用戶(hù)
session.commit()  # 提交更改

User通過(guò)創(chuàng)建并保存為變量的實(shí)例new_user,在數(shù)據(jù)庫(kù)中創(chuàng)建該用戶(hù)所需的只是對(duì)會(huì)話的兩次調(diào)用:add()將項(xiàng)目排隊(duì)等待創(chuàng)建,然后commit()保存更改。我們現(xiàn)在應(yīng)該在數(shù)據(jù)庫(kù)的用戶(hù)表中看到一行!

使用session方法很簡(jiǎn)單,只需四種簡(jiǎn)單的方法:

  • session.add():我們可以傳遞數(shù)據(jù)模型的實(shí)例來(lái)add()快速創(chuàng)建要添加到數(shù)據(jù)庫(kù)中的新記錄。

  • session.delete():與上面一樣,delete()接受數(shù)據(jù)模型的實(shí)例。如果該記錄存在于我們的數(shù)據(jù)庫(kù)中,它將被暫存以進(jìn)行刪除。

  • session.commit():在顯式提交之前,不會(huì)保存會(huì)話中所做的更改。

  • session.close():與 SQLAlchemy 引擎不同,會(huì)話是在顯式關(guān)閉之前保持打開(kāi)狀態(tài)的連接。

刪除記錄的語(yǔ)法與創(chuàng)建記錄的語(yǔ)法非常相似。有了user變量,刪除我們創(chuàng)建的用戶(hù)就像下面一樣簡(jiǎn)單:

session.delete(new_user)
session.commit()

new_user就像魔術(shù)一樣,我們通過(guò)簡(jiǎn)單地傳遞到刪除方法來(lái)刪除與我們之前創(chuàng)建的記錄相匹配的記錄。不要只相信我的話:這個(gè)過(guò)程中最令人滿(mǎn)意的部分就是親眼看到它發(fā)生!嘗試使用您選擇的 GUI 連接到數(shù)據(jù)庫(kù),并觀察您運(yùn)行的每行代碼創(chuàng)建和刪除的記錄。

關(guān)鍵詞:SQLAlchemy,ORM數(shù)據(jù)模型,SQL表,Python類(lèi),數(shù)據(jù)模型文章來(lái)源地址http://www.zghlxwxcb.cn/article/579.html

到此這篇關(guān)于使用SQLAlchemy實(shí)施ORM數(shù)據(jù)模型 - 優(yōu)化數(shù)據(jù)庫(kù)操作的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

原文地址:http://www.zghlxwxcb.cn/article/579.html

如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)聯(lián)系站長(zhǎng)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Python 進(jìn)階(三):Python使用ORM框架SQLAlchemy操作Oracle數(shù)據(jù)庫(kù)

    Python 進(jìn)階(三):Python使用ORM框架SQLAlchemy操作Oracle數(shù)據(jù)庫(kù)

    要詳細(xì)連接Oracle數(shù)據(jù)庫(kù)并使用SQLAlchemy進(jìn)行操作,按照以下步驟進(jìn)行配置和編寫(xiě)代碼: Oracle Instant Client:Oracle 提供的客戶(hù)端庫(kù),可用于在 Python 中連接和操作 Oracle 數(shù)據(jù)庫(kù) 訪問(wèn) Oracle 官方網(wǎng)站:前往 Oracle 官方網(wǎng)站(instant-client/winx64-64-downloads) 可能需要?jiǎng)?chuàng)建一個(gè)免費(fèi)的 Oracle

    2024年02月11日
    瀏覽(37)
  • SQLAlchemy ORM指南:簡(jiǎn)化數(shù)據(jù)庫(kù)操作的最佳實(shí)踐

    SQLAlchemy ORM指南:簡(jiǎn)化數(shù)據(jù)庫(kù)操作的最佳實(shí)踐

    背景: ? SQLAlchemy是一個(gè)數(shù)據(jù)庫(kù)的ORM框架,讓我們操作數(shù)據(jù)庫(kù)的時(shí)候不要再用SQL語(yǔ)句了,跟直接操作模型一樣。操作十分便捷,其實(shí)SQLAlchemy應(yīng)該是在Flask和Django應(yīng)用的特別多,而且在flask中已經(jīng)集成了flask_sqlalchemy ,好像是 SQLAlchemy的作者和 Flask是同一個(gè),背景了解到這里就可

    2024年01月20日
    瀏覽(57)
  • python常用庫(kù)之?dāng)?shù)據(jù)庫(kù)orm框架之SQLAlchemy

    python常用庫(kù)之?dāng)?shù)據(jù)庫(kù)orm框架之SQLAlchemy

    官網(wǎng):https://www.sqlalchemy.org/ SQLAlchemy是一個(gè)基于Python實(shí)現(xiàn)的SQL工具包和ORM框架,提供了高層抽象來(lái)管理數(shù)據(jù)庫(kù)交互。 SQLAlchemy功能強(qiáng)大,可以省去很多手動(dòng)管理數(shù)據(jù)庫(kù)連接、資源、事務(wù)等重復(fù)工作,讓開(kāi)發(fā)者更加高效地使用數(shù)據(jù)庫(kù)。許多大型Python項(xiàng)目都選擇使用SQLAlchemy作為ORM框架

    2024年02月07日
    瀏覽(51)
  • Java與數(shù)據(jù)庫(kù):JDBC和ORM框架的使用和效率優(yōu)化

    Java與數(shù)據(jù)庫(kù):JDBC和ORM框架的使用和效率優(yōu)化

    ? 隨著互聯(lián)網(wǎng)的快速發(fā)展和大數(shù)據(jù)時(shí)代的到來(lái),數(shù)據(jù)庫(kù)在軟件開(kāi)發(fā)中起到了至關(guān)重要的作用。Java作為一門(mén)強(qiáng)大而廣泛應(yīng)用的編程語(yǔ)言,提供了多種與數(shù)據(jù)庫(kù)交互的方式。其中,JDBC和ORM框架是最常用的兩種方式。本文將深入探討JDBC和ORM框架的使用方法,并分享一些提高效率的

    2024年02月08日
    瀏覽(52)
  • Django創(chuàng)建應(yīng)用、ORM的進(jìn)階使用及模型類(lèi)數(shù)據(jù)庫(kù)遷移

    Django創(chuàng)建應(yīng)用、ORM的進(jìn)階使用及模型類(lèi)數(shù)據(jù)庫(kù)遷移

    Django 項(xiàng)目就是基于 Django 框架開(kāi)發(fā)的 Web 應(yīng)用,它包含了一組配置和多個(gè)應(yīng)用,我們把應(yīng)用稱(chēng)之為 App,在前文中對(duì)它也做了相應(yīng)的介紹,比如 auth、admin,它們都屬于 APP。 一個(gè) App 就是一個(gè) Python 包,通常一個(gè) App 可以包含模型、視圖、模板和 URL 配置文件,可以被應(yīng)用到多個(gè)

    2024年02月09日
    瀏覽(93)
  • Flask SQLAlchemy_Serializer ORM模型序列化

    Flask SQLAlchemy_Serializer ORM模型序列化

    在前后端分離項(xiàng)目中,經(jīng)常需要把ORM模型轉(zhuǎn)化為字典,再將字典轉(zhuǎn)化為JSON格式的字符串。在遇到sqlalchemy_serializer之前,我都是通過(guò)類(lèi)似Java中的反射原理,獲取當(dāng)前ORM模型的所有字段,然后寫(xiě)一個(gè)to_dict方法來(lái)將字段以及他的值封裝成字典。大概的代碼如下所示: 這種做法雖然

    2024年02月16日
    瀏覽(16)
  • SqlAlchemy使用教程(五) ORM API 編程入門(mén)

    SqlAlchemy使用教程(五) ORM API 編程入門(mén)

    SqlAlchemy使用教程(一) 原理與環(huán)境搭建 SqlAlchemy使用教程(二) 入門(mén)示例及編程步驟 SqlAlchemy使用教程(三) CoreAPI訪問(wèn)與操作數(shù)據(jù)庫(kù)詳解 SqlAlchemy使用教程(四) MetaData 與 SQL Express Language 的使用 SqlAlchemy使用教程(五) ORM API 編程入門(mén) 前一章用SQL表達(dá)式(SQL Express)語(yǔ)法操作數(shù)據(jù)庫(kù)時(shí),仍然

    2024年01月23日
    瀏覽(28)
  • python使用SQLAlchemy進(jìn)行mysql的ORM操作

    現(xiàn)在很多的企業(yè)進(jìn)行后端開(kāi)發(fā)時(shí),程序員在分析完業(yè)務(wù)后,會(huì)使用Java的SpringBoot或者Python的Django、Flask等網(wǎng)絡(luò)框架進(jìn)行項(xiàng)目開(kāi)發(fā)。在這些網(wǎng)絡(luò)框架業(yè)務(wù)邏輯代碼編寫(xiě)的過(guò)程中,很大概率會(huì)需要使用到MySQL數(shù)據(jù)庫(kù),但是原生的SQL語(yǔ)句又存在被SQL注入的風(fēng)險(xiǎn),而且在復(fù)雜的查詢(xún)時(shí),

    2024年02月07日
    瀏覽(25)
  • SqlAlchemy使用教程(六) -- ORM 表間關(guān)系的定義與CRUD操作

    SqlAlchemy使用教程(六) -- ORM 表間關(guān)系的定義與CRUD操作

    SqlAlchemy使用教程(一) 原理與環(huán)境搭建 SqlAlchemy使用教程(二) 入門(mén)示例及編程步驟 SqlAlchemy使用教程(三) CoreAPI訪問(wèn)與操作數(shù)據(jù)庫(kù)詳解 SqlAlchemy使用教程(四) MetaData 與 SQL Express Language 的使用 SqlAlchemy使用教程(五) ORM API 編程入門(mén) 本章內(nèi)容,稍微有些復(fù)雜,建議騰出2小時(shí)空閑時(shí)間,

    2024年01月23日
    瀏覽(28)
  • 【Django】forms使用sqlalchemy生成數(shù)據(jù)庫(kù)中下拉列表數(shù)據(jù)

    Django從表單中獲取數(shù)據(jù) 一種更簡(jiǎn)單的方法來(lái)實(shí)現(xiàn)所需的功能是ARRAY直接在查詢(xún)中使用SQL (如果數(shù)據(jù)庫(kù)支持) get_field_value_list()是一個(gè)查詢(xún)模型以獲取下拉選項(xiàng)列表的函數(shù), ChoiceField需要一個(gè)元組才能正常工作,field是我在下拉列表中想要的值 . 再init 方法設(shè)置choices 取值ge

    2024年02月12日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包