溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python?ORM框架中的SQLAlchemy怎么用

發(fā)布時間:2022-03-07 09:13:17 來源:億速云 閱讀:133 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下Python ORM框架中的SQLAlchemy怎么用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

一、SQLAlchemy 介紹

1.1 ORM 的概念

ORM全稱Object Relational Mapping(對象關(guān)系映射),通過 ORM 就能使用 python 中的對象操作數(shù)據(jù)庫(在底層轉(zhuǎn)換為sql語句),免去sql語句的書寫。

但是,由于抽象程度較高,所以 sql 語句的執(zhí)行效率比較低,因此有些情況下,還是需要我們親自書寫sql語句。

ORM 是通過以下對應(yīng)關(guān)系,將 python 代碼轉(zhuǎn)換為 sql 語句的:

python對象關(guān)系型數(shù)據(jù)庫
類屬性字段
類的實例對象記錄
實例對象的屬性值記錄的字段值

1.2 SQLAlchemy介紹

django 中訪問數(shù)據(jù)庫,通常會使用 django 自帶的 ORM(Object Relational Mapping)對象關(guān)系映射來訪問數(shù)據(jù)庫,只需要用python的語法來操作對象,就能被自動映射為 sql 語句。

而 SQLAlchemy 則是一個專門的對象關(guān)系映射器和 Python SQL工具包,旨在實現(xiàn)高效和高性能的數(shù)據(jù)庫訪問。

1.3 架構(gòu)

Python?ORM框架中的SQLAlchemy怎么用

  • Schema / Types: 類到表之間的映射規(guī)則。

  • SQL Expression Language :SQL 語句。

  • Engine :引擎。

  • Connection Pooling: 連接池。

  • Dialect: 方言,調(diào)用不同的數(shù)據(jù)庫 API(Oracle, postgresql, Mysql) 并執(zhí)行對應(yīng)的 SQL語句。

1.4 異步

SQLAlchemy 在1.4版本之前,通過 greenlet 實現(xiàn)對異步的支持,而在1.4及之后版本中,添加了 python asyncio 標(biāo)準(zhǔn)庫的支持。所以,這需要 python 解釋器版本在 3.6+。

1.5 安裝

安裝 SQLAlchemy(1.4版本):

pip install SQLAlchemy

如果需要 greenlet 異步支持:

pip install sqlalchemy[asyncio]

二、SQLAlchemy 快速入門

2.1 創(chuàng)建配置(可選)

這一步不是必要的,但將配置單獨放置一個文件中,能方便我們管理和修改。

創(chuàng)建一個配置文件,如 settings.py:

DBMS = 'mysql'  # 數(shù)據(jù)庫管理系統(tǒng)名稱:如 sqlite、mysql、oracle等 
DBAPI = 'pymysql'  # 所使用的 DBAPI(第三方驅(qū)動程序),如 pysqlite、pymysql 等

# 下面就是數(shù)據(jù)庫管理系統(tǒng)的內(nèi)容:主機(jī)IP、端口、用戶名、密碼、數(shù)據(jù)庫
HOST = 'localhost'  
PORT = 3306  
USERNAME = 'root'
PASSWORD = '123456'
DB = 'myclass'

DB_URI = f'{DBMS}+{DBAPI}://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DB}'

2.2 創(chuàng)建引擎和獲取、關(guān)閉連接

任何 SQLAlchemy 應(yīng)用程序的開始都是一個名為 Engine 的對象,它是一個為特定的數(shù)據(jù)庫服務(wù)器創(chuàng)建一次的全局對象,可以理解為通過 SQLAlchemy 操作數(shù)據(jù)庫的連接中心,保存著連接池。

from sqlalchemy import create_engine
from settings import DB_URI


engine = create_engine(DB_URI)  # 創(chuàng)建引擎
# 也可以直接傳入字符串,不使用配置文件
# engine = create_engine("數(shù)據(jù)庫管理系統(tǒng)名稱+驅(qū)動://用戶名:密碼@主機(jī)IP:端口號/數(shù)據(jù)庫名稱", echo=True, future=True)

conn = engine.connect()  # 獲取連接
result = conn.execute('SQL語句')  # 執(zhí)行SQL
print(result.fetchone())  # 打印 SQL 執(zhí)行結(jié)果中的一行
conn.close()  # 關(guān)閉連接

create_engine()的其他常用參數(shù):

  • echo:設(shè)置為 True,表示將 SQL 記錄到記錄器,該記錄器將 SQL 寫入標(biāo)準(zhǔn)輸出。

  • future:使用2.0風(fēng)格的引擎和連接 API,以便使用 2.0 版本中的新特性。

  • encoding:默認(rèn)為 utf-8。

  • pool_size:在連接池中保持打開的連接數(shù)。

2.3 創(chuàng)建 ORM 模型

from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, String

# 創(chuàng)建基類
Base = declarative_base()


# 每一個模型類都要繼承 declarative_base() 創(chuàng)建的基類
class User(Base):
    # 定義表名
    __tablename__ = 'users'
    
    # 定義字段,參數(shù)為字段類型和約束
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String)
    age = Column(Integer)
    sex = Column(String(10))

2.4 創(chuàng)建會話

每次在 python 中執(zhí)行完操作后,都需要通過 session 提交到數(shù)據(jù)庫:

from sqlalchemy.orm import sessionmaker

# 創(chuàng)建會話,相當(dāng)于 Django ORM 的 objects
Session = sessionmaker(bind=engine)
session = Session()

# 執(zhí)行數(shù)據(jù)的增刪改查……
# 比如,新增數(shù)據(jù)
# session.add(模型類(類屬性=值,……))

# 提交
session.commit()
# 關(guān)閉session
session.close()

在commit()之前,可以取消對實例對象所做的修改,也就是回滾:

session.rollback()

2.5 創(chuàng)建和刪除表

創(chuàng)建所有表:

Base.metadata.create_all(engin)

刪除所有表:

Base.metadata.drop_all(engin)

2.6 新增數(shù)據(jù)

新增數(shù)據(jù):

變量名 = 模型類(類屬性=值,……)
session.add(變量名)

批量新增:

session.add_all([
    模型類(類屬性=值,……),
    模型類(類屬性=值,……)
    ……
])

2.7 查詢數(shù)據(jù)

查詢所有:

變量名 = session.query(模型類).all()

返回模型類實例對象列表。

查詢指定字段:

變量名 = session.query(模型類.字段).all()

只獲取返回結(jié)果的第一個:

變量名 = session.query(模型類).first()

連表查詢:

變量名 = session.query(模型類1,模型類2).filter(條件).all()

# 如,查詢用戶 ID 及其愛好的 ID
res = session.query(User, Hobby).filter(User.hobby_id == Hobby.id).all()

返回一個元組構(gòu)成的列表,元組包含兩個實例對象。

過濾:

變量名 = session.query(模型類).filter(條件).all()

# 如,查詢年齡大于18歲的學(xué)生名字
res = session.query(Student.name).filter(Student.age >= 18).all()

條件中常用運算符:

Python?ORM框架中的SQLAlchemy怎么用

多條件過濾:

# 條件之間默認(rèn)為 and 關(guān)系
變量名 = session.query(模型類).filter(條件1, 條件2……).all()


# 使用 or 
from sqlalchemy import or_
變量名 = session.query(模型類).filter(or_(條件1, 條件2……)).all()

排序:

變量名 = session.query(模型類).order_by(排序依據(jù)字段.desc()).all()     # desc 表示倒序,寫 asc 或不寫就是升序

統(tǒng)計個數(shù):

變量名 = session.query(模型類).count()

切片:

變量名 = session.query(模型類).all()[1:3]

2.8 修改數(shù)據(jù)

變量名 = session.query(模型類).filter(條件).update({"字段":值})
# 不要忘記提交

2.9 刪除數(shù)據(jù)

session.query(模型類).filter(條件).delete()

三、多表操作

下面的內(nèi)容中,我將稱定義了外鍵字段的模型類為被關(guān)聯(lián)模型,另一個為關(guān)聯(lián)模型。

3.1 一對多

創(chuàng)建模型:

外鍵定義在多的一方。

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class 模型類名稱(Base):
    __tablename__ = '表名'
    
    字段 = Column(類型,約束)
    ……
    外鍵字段 = Column(類型,其他約束,ForeignKey(關(guān)聯(lián)模型.字段))  # 重點
    關(guān)聯(lián)模型名稱小寫 = relationship("關(guān)聯(lián)模型的名稱",backref="用于反向查詢的名稱")    # 不是字段,不會在數(shù)據(jù)庫中創(chuàng)建

新增數(shù)據(jù):

# 正向新增
變量名 = 被關(guān)聯(lián)模型(字段=值,……,外鍵字段=關(guān)聯(lián)模型(字段=值……))
session.add(變量名)

# 反向新增
變量名A = 關(guān)聯(lián)模型(字段=值,……)
變量名A.backref的值 = [被關(guān)聯(lián)模型的實例1,被關(guān)聯(lián)模型的實例2……]
session.add(變量名A)

正向查詢:

先獲取被關(guān)聯(lián)模型的實例,然后通過實例.外鍵獲取關(guān)聯(lián)對象。

反向查詢:

先獲取關(guān)聯(lián)模型的實例,然后通過實例.backref的值獲取被關(guān)聯(lián)模型的實例對象。

3.2 多對多

創(chuàng)建模型:

新建中間表,只保存雙方的對應(yīng)關(guān)系即可。

在其中一方,定義 relationship:

關(guān)聯(lián)模型類名稱小寫 = relationship("關(guān)聯(lián)模型類的名稱", secondary='中間表模型類的名稱小寫', backref="用于反向查詢的名稱")    # 不是字段,不會在數(shù)據(jù)庫中創(chuàng)建

新增數(shù)據(jù):

在雙方創(chuàng)建好數(shù)據(jù)后,直接在中間表中添加對應(yīng)關(guān)系。

正向、反向查詢:

與一對多模型一致。

看完了這篇文章,相信你對“Python ORM框架中的SQLAlchemy怎么用”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI