14 Python ORM框架操作MySQL

目錄鏈接:http://www.reibang.com/p/2c104aaadb03

為什么要使用ORM 框架

圖片來自極客時間SQL必知必會專欄.png

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ù)表隙姿,如下圖:

圖片來自極客時間SQL必知必會專欄.png

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)行定義

常用的數(shù)據(jù)類型.png

除了指定 Column 的數(shù)據(jù)類型以外膘盖, 我們也可以指定 Column 的參數(shù)胧弛, 這些參數(shù)可以幫我們對對象創(chuàng)建列約束:

對象創(chuàng)建列約束.png

引用數(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ù)的操作。


增.png


# 增加 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()
查.png

對整個數(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()
刪.png


先進(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()
改.png

參考資料:

練習(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

知乎個人首頁:
https://www.zhihu.com/people/lichangke/

簡書個人首頁:
http://www.reibang.com/u/3e95c7555dc7

個人Blog:
https://lichangke.github.io/

歡迎大家來一起交流學(xué)習(xí)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市茴恰,隨后出現(xiàn)的幾起案子颠焦,更是在濱河造成了極大的恐慌,老刑警劉巖往枣,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伐庭,死亡現(xiàn)場離奇詭異,居然都是意外死亡分冈,警方通過查閱死者的電腦和手機圾另,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雕沉,“玉大人集乔,你說我怎么就攤上這事∑陆罚” “怎么了扰路?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長倔叼。 經(jīng)常有香客問我汗唱,道長,這世上最難降的妖魔是什么丈攒? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任渡嚣,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘识椰。我一直安慰自己绝葡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布腹鹉。 她就那樣靜靜地躺著藏畅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪功咒。 梳的紋絲不亂的頭發(fā)上愉阎,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音力奋,去河邊找鬼榜旦。 笑死,一個胖子當(dāng)著我的面吹牛景殷,可吹牛的內(nèi)容都是我干的溅呢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼猿挚,長吁一口氣:“原來是場噩夢啊……” “哼咐旧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绩蜻,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤铣墨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后办绝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伊约,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年孕蝉,在試婚紗的時候發(fā)現(xiàn)自己被綠了屡律。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡昔驱,死狀恐怖疹尾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骤肛,我是刑警寧澤纳本,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站腋颠,受9級特大地震影響繁成,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淑玫,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一巾腕、第九天 我趴在偏房一處隱蔽的房頂上張望面睛。 院中可真熱鬧,春花似錦尊搬、人聲如沸叁鉴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幌墓。三九已至,卻和暖如春冀泻,著一層夾襖步出監(jiān)牢的瞬間常侣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工弹渔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胳施,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓肢专,卻偏偏與公主長得像舞肆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸟召,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容