软硬件环境
- Windows 10 64bit
- anaconda with python 3.7
- mysql 8.0.20
- sqlalchemy
视频看这里
此处是 youtube
的播放链接,需要科学上网。喜欢我的视频,请记得订阅我的频道,打开旁边的小铃铛,点赞并分享,感谢您的支持。
前言
前文 python3中的mysql数据库操作 已经介绍过利用 pymysql
来操作 mysql
数据库,本文介绍一个 ORM
框架 SQLAlchemy
,它可以帮助我们更加优雅、更加高效的实现数据库操作,而且还不限于 mysql
数据库。
什么是ORM
ORM
即 Object Rational Mapping
,对象关系映射。百度百科中是这样解释的
对象-关系映射(OBJECT RELATIONAL MAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作实体对象的属性和方法。ORM技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。
用一句话来概括就是,把关系数据库的表结构映射到对象上。操作对象的属性就等于操作数据库中的记录。
SQLAlchemy实践
在写代码之前,我们先准备下数据库,这里还是以 mysql
为例,其它的数据库也类似,可以参靠 sqlalchemy
的官方文档。
表结构保持跟前文的一致,表名是 testtable
,有三个字段
id
,数据类型是INT(11)
,设为主键、唯一、非空、UNSIGNED
、AUTO INCREMENT
name
,数据类型是VARCHAR(45)
,设为非空sex
,数据类型是VARCHAR(45)
,设为非空
接下来,安装相关的工具包
pip install pymsql
pip install sqlalchemy
最后来写代码
from sqlalchemy import Column, String, Integer, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 创建对象的基类:
Base = declarative_base()
class Person(Base):
# 表名
__tablename__ = 'testtable'
# 表结构
id = Column(Integer(),primary_key=True)
name = Column(String(45))
sex = Column(String(45))
def __init__(self, id, name, sex):
self.id = id
self.name = name
self.sex = sex
# 初始化数据库连接,:
engine = create_engine('mysql+pymysql://root:toor@localhost:3306/testdb', echo=False)
# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)
session = DBSession()
# 增操作,增加3条记录
item1 = Person(id=1, name='xgx', sex='male')
session.add(item1)
item2 = Person(id=2, name='xgx1', sex='female')
session.add(item2)
item3 = Person(id=3, name='xgx1', sex='male')
session.add(item3)
item4 = Person(id=4, name='xgx2', sex='female')
session.add(item4)
session.commit()
session.close()
# 查操作
session1 = DBSession()
persons = session1.query(Person).filter(Person.id < '4').all()
for i in range(len(persons)):
print(persons[i].id)
print(persons[i].name)
print(persons[i].sex)
session1.close()
# 改操作,将id为2的记录的name字段修改为xxx
session2 = DBSession()
session2.query(Person).filter(Person.id == '2').update({Person.name: 'xxx'}, synchronize_session=False)
session2.commit()
session2.close()
# 查看修改结果
session3 = DBSession()
print('\n')
print(session3.query(Person).filter(Person.id == '2').one().name)
session3.close()
# 删操作,删除id为3的记录
session4 = DBSession()
session4.query(Person).filter(Person.id == '3').delete()
session4.commit()
session4.close()
执行上述脚本后,用 mysql-workbench
查看数据库
数据库中的记录跟代码要实现的意图是完全相符。
补充
这里有个实际需求,比如查询表中的 id
的最大值和 id
最大值对应的那条记录,解决这2个问题的方法是完全不同的。求 id
最大值可以使用函数 max
,而最大 id
对应的记录需要先根据 id
字段进行排序(倒序),然后取第一条记录
对应的代码是
# 找最大id
from sqlalchemy.sql import func
session.query(func.max(Person.id).scalar()
# 找最大id对应的记录
session.query(Person).order_by(Person.id.desc()).first()