14 Python ORM框架操作MySQL

目录链接:https://www.jianshu.com/p/2c104aaadb03

为什么要使用ORM 框架

图片来自极客时间SQL必知必会专栏.png

ORM提供了一种持久化模式, 可以高效地对数据库进行访问。 ORM 的英文是 Object Relation Mapping,对象关系映射,是 RDBMS 和业务实体对象之间的一个映射,把底层的 RDBMS 封装成业务实体对象,提供给业务逻辑层使用。 好处:简单可复用,不用关注底层的数据库访问细节,注意力关注到业务逻辑层。不足:对于复杂的数据查询,采用ORM会力不从心,同时在效率上也会有损耗。

Python 中的 ORM 框架都有哪些

三种主流的 ORM 框架: Django、SQLALchemy、peewee

Django
Django, 它是 Python 的 WEB 应用开发框架, 本身是大而全的方式。 Django 采用了 MTV 的框架模式, 包括了 Model(模型) , View(视图)和 Template(模版)Model 模型只是 Django 的一部分功能, 我们可以通过它来实现数据库的增删改查操作。Model 映射到一个数据表,如下图:

图片来自极客时间SQL必知必会专栏.png

SQLALchemy

SQLALchemy,它提供了 SQL 工具包及 ORM工具,支持 ORM 和支持原生SQL

peewee
一个轻量级的 ORM 框架。peewee 采用了 Model 类、 Field 实例和 Model 实例来与数据库建立映射关系, 从而完成面向对象的管理方式。

使用 SQLAlchemy 来操作 MySQL

安装相应的工具包:

pip install sqlalchemy
初始化数据库连接
from sqlalchemy import create_engine
# 初始化数据库连接,修改为你的数据库用户名和密码
engine = create_engine('mysql+mysqlconnector://户名: 密码@IP地址:端口号/数据库名称')

创建模型

## 引用数据类型
from sqlalchemy import Column, String, Integer, Float
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
# 定义 Player 对象:
class Player(Base):
    # 表的名字:
    __tablename__ = 'player'

    # 表的结构:
    player_id = Column(Integer, primary_key=True, autoincrement=True)
    team_id = Column(Integer)
    player_name = Column(String(255))
    height = Column(Float(3, 2))

tablename 指明了模型对应的数据表名称,在 Player 模型中对采用的变量名进行定义, 变量名需要和数据表中的字段名称保持一致,采用 Column 对字段进行定义

常用的数据类型.png

除了指定 Column 的数据类型以外, 我们也可以指定 Column 的参数, 这些参数可以帮我们对对象创建列约束:

对象创建列约束.png

引用数据类型

from sqlalchemy import Column, String, Integer, Float

对数据表进行增删改查

from sqlalchemy.orm import sessionmaker
# 创建 DBSession 类型:
DBSession = sessionmaker(bind=engine)
# 创建 session 对象:
session = DBSession()

# 创建 Player 对象:
new_player = Player(team_id = 1003, player_name = " 约翰 - 科林斯 ", height = 2.08)
# 添加到 session:
session.add(new_player)
# 提交即保存到数据库:
session.commit()
# 关闭 session:
session.close()

首先需要初始化 DBSession, 相当于创建一个数据库的会话实例 session。 通过 session 来完成新球员的添加。

通过 Player 类来完成数据创建, 在参数中指定相应的 team_id, player_name, height 即可。

然后把创建好的对象 new_player 添加到 session 中, 提交到数据库即可完成添加数据的操作。


增.png


# 增加 to_dict() 方法到 Base 类中
def to_dict(self):
    return {c.name: getattr(self, c.name, None)
            for c in self.__table__.columns}
# 创建 DBSession 类型:
DBSession = sessionmaker(bind=engine)
# 创建 session 对象:
session = DBSession()
# 将对象可以转化为 dict 类型
Base.to_dict = to_dict
# 查询身高 >=2.08 的球员 同时 ≤ 2.10 的球员有哪些, AND 的关系
# rows = session.query(Player).filter(Player.height >=2.08, Player.height <=2.10).all()
# 查询身高 >=2.08 的球员 或 ≤ 2.10 的球员有哪些 OR 的关系
# 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

对整个数据行进行查询, 采用 session.query(Player) , 相当于使用的是 SELECT *。
使用 filter 方法, 对应的是 SQL 中的 WHERE 条件查询。filter 也支持多条件查询。

我们需要进行查询, 然后从 session 对象中进行删除, 最后进行 commit 提交

# 创建 DBSession 类型:
DBSession = sessionmaker(bind=engine)
# 创建 session 对象:
session = DBSession()
row = session.query(Player).filter(Player.player_name == '约翰 - 科林斯').first()
session.delete(row)
session.commit()
session.close()
删.png


先进行查询, 然后再进行修改

# 创建 DBSession 类型:
DBSession = sessionmaker(bind=engine)
# 创建 session 对象:
session = DBSession()
row = session.query(Player).filter(Player.player_name=="约翰 - 科林斯 ").first()
row.height = 2.17
session.commit()
session.close()
改.png

参考资料:

练习数据库使用 SQL必知必会专栏(极客时间)中的作者提供的 王者荣耀数据库以及NBA数据库
练习系统 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/

简书个人首页:
https://www.jianshu.com/u/3e95c7555dc7

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

欢迎大家来一起交流学习

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容