目錄鏈接:http://www.reibang.com/p/2c104aaadb03
為什么要使用ORM 框架
ORM提供了一種持久化模式猾蒂, 可以高效地對數(shù)據(jù)庫進(jìn)行訪問向挖。 ORM 的英文是 Object Relation Mapping循帐,對象關(guān)系映射桌硫,是 RDBMS 和業(yè)務(wù)實體對象之間的一個映射,把底層的 RDBMS 封裝成業(yè)務(wù)實體對象恭取,提供給業(yè)務(wù)邏輯層使用妒貌。 好處:簡單可復(fù)用,不用關(guān)注底層的數(shù)據(jù)庫訪問細(xì)節(jié),注意力關(guān)注到業(yè)務(wù)邏輯層通危。不足:對于復(fù)雜的數(shù)據(jù)查詢,采用ORM會力不從心,同時在效率上也會有損耗。
Python 中的 ORM 框架都有哪些
三種主流的 ORM 框架: Django灌曙、SQLALchemy黄鳍、peewee
Django
Django, 它是 Python 的 WEB 應(yīng)用開發(fā)框架平匈, 本身是大而全的方式框沟。 Django 采用了 MTV 的框架模式, 包括了 Model(模型) 增炭, View(視圖)和 Template(模版)Model 模型只是 Django 的一部分功能忍燥, 我們可以通過它來實現(xiàn)數(shù)據(jù)庫的增刪改查操作。Model 映射到一個數(shù)據(jù)表隙姿,如下圖:
SQLALchemy
SQLALchemy梅垄,它提供了 SQL 工具包及 ORM工具,支持 ORM 和支持原生SQL
peewee
一個輕量級的 ORM 框架输玷。peewee 采用了 Model 類队丝、 Field 實例和 Model 實例來與數(shù)據(jù)庫建立映射關(guān)系, 從而完成面向?qū)ο蟮墓芾矸绞健?/p>
使用 SQLAlchemy 來操作 MySQL
安裝相應(yīng)的工具包:
pip install sqlalchemy
初始化數(shù)據(jù)庫連接
from sqlalchemy import create_engine
# 初始化數(shù)據(jù)庫連接欲鹏,修改為你的數(shù)據(jù)庫用戶名和密碼
engine = create_engine('mysql+mysqlconnector://戶名: 密碼@IP地址:端口號/數(shù)據(jù)庫名稱')
創(chuàng)建模型
## 引用數(shù)據(jù)類型
from sqlalchemy import Column, String, Integer, Float
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
# 定義 Player 對象:
class Player(Base):
# 表的名字:
__tablename__ = 'player'
# 表的結(jié)構(gòu):
player_id = Column(Integer, primary_key=True, autoincrement=True)
team_id = Column(Integer)
player_name = Column(String(255))
height = Column(Float(3, 2))
tablename 指明了模型對應(yīng)的數(shù)據(jù)表名稱机久,在 Player 模型中對采用的變量名進(jìn)行定義, 變量名需要和數(shù)據(jù)表中的字段名稱保持一致赔嚎,采用 Column 對字段進(jìn)行定義
除了指定 Column 的數(shù)據(jù)類型以外膘盖, 我們也可以指定 Column 的參數(shù)胧弛, 這些參數(shù)可以幫我們對對象創(chuàng)建列約束:
引用數(shù)據(jù)類型
from sqlalchemy import Column, String, Integer, Float
對數(shù)據(jù)表進(jìn)行增刪改查
增
from sqlalchemy.orm import sessionmaker
# 創(chuàng)建 DBSession 類型:
DBSession = sessionmaker(bind=engine)
# 創(chuàng)建 session 對象:
session = DBSession()
# 創(chuàng)建 Player 對象:
new_player = Player(team_id = 1003, player_name = " 約翰 - 科林斯 ", height = 2.08)
# 添加到 session:
session.add(new_player)
# 提交即保存到數(shù)據(jù)庫:
session.commit()
# 關(guān)閉 session:
session.close()
首先需要初始化 DBSession, 相當(dāng)于創(chuàng)建一個數(shù)據(jù)庫的會話實例 session侠畔。 通過 session 來完成新球員的添加结缚。
通過 Player 類來完成數(shù)據(jù)創(chuàng)建, 在參數(shù)中指定相應(yīng)的 team_id, player_name, height 即可软棺。
然后把創(chuàng)建好的對象 new_player 添加到 session 中红竭, 提交到數(shù)據(jù)庫即可完成添加數(shù)據(jù)的操作。
查
# 增加 to_dict() 方法到 Base 類中
def to_dict(self):
return {c.name: getattr(self, c.name, None)
for c in self.__table__.columns}
# 創(chuàng)建 DBSession 類型:
DBSession = sessionmaker(bind=engine)
# 創(chuàng)建 session 對象:
session = DBSession()
# 將對象可以轉(zhuǎn)化為 dict 類型
Base.to_dict = to_dict
# 查詢身高 >=2.08 的球員 同時 ≤ 2.10 的球員有哪些喘落, AND 的關(guān)系
# rows = session.query(Player).filter(Player.height >=2.08, Player.height <=2.10).all()
# 查詢身高 >=2.08 的球員 或 ≤ 2.10 的球員有哪些 OR 的關(guān)系
# from sqlalchemy import or_
# rows = session.query(Player).filter(or_(Player.height >=2.08, Player.height <=2.10)).all()
rows = session.query(Player).filter(Player.height >= 2.08).all()
print([row.to_dict() for row in rows])
session.close()
對整個數(shù)據(jù)行進(jìn)行查詢茵宪, 采用 session.query(Player) , 相當(dāng)于使用的是 SELECT *揖盘。
使用 filter 方法眉厨, 對應(yīng)的是 SQL 中的 WHERE 條件查詢锌奴。filter 也支持多條件查詢兽狭。
刪
我們需要進(jìn)行查詢, 然后從 session 對象中進(jìn)行刪除鹿蜀, 最后進(jìn)行 commit 提交
# 創(chuàng)建 DBSession 類型:
DBSession = sessionmaker(bind=engine)
# 創(chuàng)建 session 對象:
session = DBSession()
row = session.query(Player).filter(Player.player_name == '約翰 - 科林斯').first()
session.delete(row)
session.commit()
session.close()
改
先進(jìn)行查詢箕慧, 然后再進(jìn)行修改
# 創(chuàng)建 DBSession 類型:
DBSession = sessionmaker(bind=engine)
# 創(chuàng)建 session 對象:
session = DBSession()
row = session.query(Player).filter(Player.player_name=="約翰 - 科林斯 ").first()
row.height = 2.17
session.commit()
session.close()
參考資料:
練習(xí)數(shù)據(jù)庫使用 SQL必知必會專欄(極客時間)中的作者提供的 王者榮耀數(shù)據(jù)庫以及NBA數(shù)據(jù)庫
練習(xí)系統(tǒng) MySQL Server version: 5.7.26-0ubuntu0.16.04.1 (Ubuntu)
SQL必知必會專欄(極客時間)鏈接:
http://gk.link/a/103Sm
GitHub鏈接:
https://github.com/lichangke/LeetCode
個人Blog:
https://lichangke.github.io/
歡迎大家來一起交流學(xué)習(xí)