SQLAlchemy简介
它是一个ORM(Object-Relational Mapping)框架,是python最好的ORM工具之一,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型
提示一点:ORM并非是非用不可,但是,为了代码的健壮性,我们最好还是使用ORM,一方面,为了提高开发效率,另一方面,为了使别人能够看懂代码。
安装
安装sqlalchemy:
pip install sqlalchemy
连接数据库
所有的关系型数据库,都可以通过这样连接
'数据库类型+数据库驱动名称://用户名:密码@机器地址:端口号/数据库名'
我们就拿mysql打个比方:
需要安装pymysql,因为引擎基于pymysql
pip install pymysql
# 首先,导包
from sqlalchemy import create_engine
# 创建数据库连接
connect = create_engine('mysql+pymysql://root:mySQL@localhost:3306/test01')
# 可以顺便指定一下编码方式
# create_engine('mysql+pymysql://root:mySQL@localhost:3306/test01?charset=utf8')
这样,我们就能连接上数据库了
描述表结构(模型)
要使用 ORM, 我们需要将数据表的结构用 ORM 的语言描述出来。SQLAlchmey 提供了一套 Declarative 系统来完成这个任务。我们以创建一个
user
表为例,看看它是怎么用 SQLAlchemy 的语言来描述的
from sqlalchemy.ext.declarative import declarative_base
ModelBase = declarative_base() #<-元类
class User(ModelBase):
# 定义表名
__tablename__ = "user"
# 声明字段
id = Column(Integer, primary_key=True)
username = Column(String(length=255))
password = Column(String(length=255))
这个模型,是对数据表结构的映射,无论是进行迁移文件还是操作数据库,都需要使用到它
一对多关系
一对多,也就是我们所谓的外键,假如,有个user表,要求每个user都要有一个角色,我们就需要另外建立一张角色表,来通过外键连接角色表,用来实现关联,一个角色可以被多个user关联,一个user只能有一个角色,这,就是一对多的关系
class User(ModelBase):
# 定义表名
__tablename__ = "user"
# 声明字段
id = Column(Integer, primary_key=True)
username = Column(String(length=255))
password = Column(String(length=255))
role = Column(Integer,ForeignKey('role.id'))
class Role(ModelBase):
__tablename__ = 'role'
id = Column(Integer, primary_key=True)
name = Column(String(length=255))
isnn = relationship('User')
可以看到,我们定义了ForeignKey来指定关联哪张表,连接哪个字段
而“一”这里,提供了一个relationship方法来表明两个模型中的关系
而relationship有一个
backref
,来指定反向访问的属性名称,在我们的这个例子中,就是用来反向访问,都有哪些用户是这个角色
添加数据(Create)
我们依赖上方的代码来进行添加
⚠!!!在SQLAlchemy中,CRUD都是通过会话(session)进行的,所以我们必须要先创建会话,每一个SessionLocal实例就是一个数据库session
from sqlalchemy.orm import sessionmaker
# 创建DBSession类型
# flush()是指发送数据库语句到数据库,但数据库不一定执行写入磁盘;commit()是指提交事务,将变更保存到数据库文件
DBSession = sessionmaker(bind=connect,autoflush=False, autocommit=False, expire_on_commit=True)
# 创建session对象
session = DBSession()
# 创建新User对象(我们要添加的数据)
new_user = User(id=1,username='Bob',password='123')
# 添加到session
session.add(new_user)
# 提交即保存到数据库
session.commit()
# 关闭session
session.close()
ok,执行一下,可以看到我们的数据库中已经有了这条数据

查找数据(Retrieve)
重新得到数据
user = session.query(User).filter(User.id==5).one()
print(type(user))
print('name',user.username)
这只是查找第一条
如果要获取多条,那么就可以将one换成all
user = session.query(User).filter(User.id==5).all()
print(type(user))
for i in user:
print(i.username)
注意,因为获取多条,他的类型是列表,所以,我们需要处理一下
更新数据(Update)
首先呢,我们需要找出需要修改的数据,然后直接进行update修改
session.query(User).filter(User.id==1).update({'username':'haoye'{)
session.commit()
删除数据(delete)
操作和update一致,只是最后换成dalete
session.query(User).filter(User.id==1).delete()
session.commit()
总结:最为简单的CRUD操作并没有什么难度,只是需要注意的是,为了节约内存资源,最好是做完操作之后,将session进行关闭
如果我们要学习除了django之外的web框架,几乎都离不开sqlachemy,所以,将sqlachemy学好收益还是非常大的
- Post link: https://www.godhearing.cn/fastapi-xue-xi-zhi-lu-2-sqlalchemy/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.