Python?ORM框架之SQLAlchemy?的基礎(chǔ)用法
一、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)
- 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)容:主機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ū)動://用戶名:密碼@主機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:默認為 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()
條件中常用運算符:
多條件過濾:
# 條件之間默認為 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)系。
正向、反向查詢:
與一對多模型一致。
到此這篇關(guān)于Python ORM框架之SQLAlchemy 的基礎(chǔ)用法的文章就介紹到這了,更多相關(guān)SQLAlchemy 的用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python?flask?sqlalchemy的簡單使用及常用操作
- python flask sqlalchemy連接數(shù)據(jù)庫流程介紹
- python sqlalchemy動態(tài)修改tablename兩種實現(xiàn)方式
- Python+SQLAlchemy輕松實現(xiàn)管理數(shù)據(jù)庫
- Python SQLAlchemy簡介及基本用法
- 3個Python?SQLAlchemy數(shù)據(jù)庫操作功能詳解
- Python使用SQLAlchemy模塊實現(xiàn)操作數(shù)據(jù)庫
- Python?SQLAlchemy與數(shù)據(jù)庫交互操作完整指南
- Python?SQLAlchemy庫的實現(xiàn)示例
相關(guān)文章
python中關(guān)于數(shù)據(jù)類型的學(xué)習(xí)筆記
在本篇文章里小編給大家整理了關(guān)于python中關(guān)于數(shù)據(jù)類型的學(xué)習(xí)筆記內(nèi)容,需要的朋友們可以參考下。2020-07-07Python利用scikit-learn實現(xiàn)近鄰算法分類的示例詳解
scikit-learn已經(jīng)封裝好很多數(shù)據(jù)挖掘的算法,這篇文章就來用scikit-learn實現(xiàn)近鄰算法分類,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-02-02基于Python實現(xiàn)簡單的學(xué)生點名系統(tǒng)
現(xiàn)在的學(xué)生大部分都很積極,會主動舉手回答問題。但是,也會遇到一些不好的情況,比如年級越高主動舉手的人越少,所以本文做了一個隨機的學(xué)生點名系統(tǒng)可以幫老師解決這些問題2022-09-0950行Python代碼實現(xiàn)視頻中物體顏色識別和跟蹤(必須以紅色為例)
本文通過50行Python代碼實現(xiàn)視頻中物體顏色識別和跟蹤效果,通過實例截圖和實例代碼給大家講解的非常詳細,需要的朋友可以參考下2019-11-11