目录
- 写在前面
- 1. 什么是SQLAlchemy
- 2. 安装SQLAlchemy
- 3. 使用方法
- 3.1 初始化数据库连接
- 3.2 创建表
- 3.2.1 基础创建表操作
- 3.2.2 常用表字段属性代码
- 3.2.3 建立数据库表关系
- (1)一对多
- (2)多对多
- 3.3 查询数据
- 3.3.1 通用的查询数据方法
- 3.3.2 过滤规则
- 3.4 向数据表中添加/删除/更改数据
- 3.4.1 添加数据
- 3.4.2 删除数据
- 3.4.3 更改数据
- 参考
写在前面
仅作个人学习与记录用。主要整理SQLAlchemy数据库访问与操作的方法。
1. 什么是SQLAlchemy
SQLAlchemy是Python SQL工具包和ORM框架,它为应用程序开发人员提供了SQL的全部功能。
它提供了一套众所周知的企业级持久性模式,这些模式是为高效和高性能的数据库访问而设计的,并被改编成一种简单的python域语言。
本文主要聚焦于SQLAlchemy在以下场景中的初级使用方法:
- 数据库访问和操作:SQLAlchemy提供了高层抽象来操作数据库,可以避免写原生SQL语句。支持多种数据库后端。
- ORM映射:建立Python类与数据库表的映射关系,简化数据模型的操作,支持声明式操作。
2. 安装SQLAlchemy
终端直接pip下载安装即可:
pip install SQLAlchemy
3. 使用方法
3.1 初始化数据库连接
要对数据库进行访问和操作,首先要连接目标数据库,代码如下:
from sqlalchemy import create_engine
db = create_engine('mysql+pymysql://',
connect_args={'user': '用户名',
'password': '密码',
'host': '数据库地址',
'port': 3306,
'database': '数据库名',
'charset': 'utf8'})
其中,connect_args是连接信息:user和password分别是数据库所在的MySQL的账号和密码,host和port是MySQL服务器的地址和端口号,database是要连接的数据库名称,charset是编码方式。
或者使用URL的方式填写连接数据库所需的信息。如下代码所示:
db = create_engine('mysql+pymysql://[用户名]:[密码]@127.0.0.1:3306/[数据库名]?charset=utf8')
3.2 创建表
3.2.1 基础创建表操作
需要注意的是,对数据库进行任何操作都需要先建立映射关系。创建数据表的代码如下:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Text, VARCHAR, DateTime,.....
from sqlalchemy import create_engine
import datetime
# 获取数据库实例
db = create_engine('mysql+pymysql://[用户名]:[密码]@127.0.0.1:3306/[数据库名]?charset=utf8')# 建立映射关系
Base = declarative_base()
class User(Base):__tablename__ = 'users' # 设置表名id = Column(Integer, primary_key=True) # id列,类型是Integer,主键name = Column(String(32), index=True, nullable=False) # name列varchar32,索引,不可为空age = Column(Integer) # age列ctime = Column(DateTime, default=datetime.datetime.now) # ctime列,类型是时间,datetime.datetime.now是录入的时间不能加括号,加了括号,以后永远是当前时间extra = Column(Text, nullable=True, unique=True) # extra列,文本类型,允许空值,重复出现的记录仅保留一条# 创建表
Base.metadata.create_all(db)
运行上述的代码后会在数据库中创建一个名为users
的表。如果需要创建多个表,只需要创建多个类即可。
3.2.2 常用表字段属性代码
SQLAlchemy 创建表时,如3.2.1代码所示,需要使用许多属性来规定表的字段的属性和行为,常用的属性如下:
属性 | 功能 |
---|---|
Column | 声明一个列 |
String | 字符串类型,参数为指定字符串的最大长度,通常用于存储短文本、用户名等字符串类型的数据 |
Text | 文本类型,用于存储大块文本 |
Integer | 整数类型,通常用于存储数值类型的 ID 编号等 |
Float | 浮点数类型,用于存储浮点类型的数据 |
Boolean | 布尔类型,用于存储布尔类型的数据 |
DateTime | 日期和时间类型,用于存储日期和时间信息 |
Date | 日期类型,用于存储日期信息 |
Time | 时间类型,用于存储时间信息 |
ForeignKey | 外键类型,用于定义外键关系 |
relationship | 定义 ORM 关系模型中的关系类型 |
back_populates | 定义反向引用的属性名称 |
primary_key=True | 指示该列是主键列 |
unique=True | 指定该列的值必须是唯一的 |
default | 指定该列的默认值 |
nullable=False | 指定该列的值不能为空 |
3.2.3 建立数据库表关系
(1)一对多
一对多的关系是一种特殊的多对多的关系,例如一个用户可以有多个电话号码,即表users
中的一条记录能够对应另一张表phone_number
中的多条记录,而表phone_number
中的一条记录只能对应表users
中的一条记录。
代码如下:
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationshipclass User(Base):__tablename__ = 'users' ...# 增加一个字段关系,User类通过Phone_number字段找到Phone_number类# 如果使用 back_populates 参数来代替 backref 参数,则Phone_number类需要被注释掉的那一行phone_number = db.relationship('Phone_number', backref='users')class Phone_number(Base):__tablename__ = 'phone_numbers'id = Column(Integer, primary_key=True)email_address = Column(String, nullable=False)user_id = Column(Integer, ForeignKey('users.id'))# user = relationship("User", back_populates="phone_numbers")
relationship
函数的目的是让 phone_number
类链接到User
类,back_populates
参数表示引用的互补属性名,也就是本身的表名。back_ref
参数表示父表的表名。
ForeignKey
即是外键,定义了两表的两列之间依赖关系,表示关联了表users
的id
和表phone_numbers
。
需要注意:
-
一对多关系中,多的一方使用Foreignkey,一的一方使用relationship。
-
如果是一对一的对应关系,则
relationship
函数增加参数uselist=False
即可。
(2)多对多
多对多关系可以举如下例子:建立一个用户与群组的表,一个用户对应多个群组,一个群组中也有多个用户。
需要引入第三张表作为中间表。代码如下:
# 中间表
class UserToGroup(Base):__tablename__ = "user_to_group"id = db.Column(db.Integer,primary_key=True)user_id = db.Column(db.Integer, db.ForeignKey("users.id"))group_id = db.Column(db.Integer, db.ForeignKey("groups.id"))# 表users
class User(Base):__tablename__ = 'users' # 设置表名id = Column(Integer, primary_key=True) # id列,类型是Integer,主键...group = db.relationship("Group", secondary="user_to_group", back_populates="user")# 表groups
class Group(Base):__tablename__ = "groups"id = db.Column(db.Integer, primary_key=True)...user = db.relationship("User", secondary="user_to_group", back_populates="group")
3.3 查询数据
3.3.1 通用的查询数据方法
以上面创建的数据表users(class User)为例。代码如下:
Session = sessionmaker(db)
session = Session()User.query.<过滤方法(非必要)>.<返回方法># 提交数据,将数据保存到数据库中
session.commit()
# 关闭会话
session.close()
常用的过滤方法如下:
过滤方法 | 说明 |
---|---|
filter(name = '张三' ) | 使用指定的规则过滤记录,返回新产生的查询对象 |
filter_by('User.name == '张三' ) | 使用指定规则过滤记录(以关键字表达式的形式),返回新产生的查询对象,只能用=符号,不能用!=,>,<。 |
order_by() | 根据指定条件对记录进行排序,返回新产生的查询对象 |
group_by() | 根据指定条件对记录进行分组,返回新产生的查询对象 |
limit() |
常用的返回方法如下:
返回方法 | 说明 |
---|---|
all() | 返回包含所有查询记录的列表 |
first() | 返回查询的第一条记录,如果未找到,则返回None |
get(name ) | 传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回None |
count() | 返回查询结果的数量 |
first_or_404() | 返回查询的第一条记录,如果未找到,则返回404错误响应 |
first_or_404() | 传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回404错误响应 |
paginate() | 返回一个Pagination对象,可以对记录进行分页处理 |
3.3.2 过滤规则
有like过滤、is过滤、正则过滤等规则。
详细的过滤规则可以参考:《Python SQLalchemy 基础操作之数据库增删改查》或者《Python ORM之SQLAlchemy全面指南》的第十一节
3.4 向数据表中添加/删除/更改数据
以上面创建的数据表users(class User)为例。使用url网络请求数据。
3.4.1 添加数据
# 插入多条记录
obj = [User(name='张三', ...),User(name='李四', ...),User(name='王五', ...)]
# 创建会话
obj_session = sessionmaker(db)
# 打开会话
db_session = obj_session()
# 向表中添加数据,此时数据保存在内存中
db_session.add_all(obj)
# 提交数据,将数据保存到数据库中
db_session.commit()
# 关闭会话
db_session.close()
3.4.2 删除数据
Session = sessionmaker(db)
session = Session()
users = User.query.all()# 删除满足给定条件'id=1'的第一条记录
user = session.query(User).filter_by(id=1).first()
session.delete(user)# 删除满足给定条件'id=1'的所有记录
session.query(User).filter_by(id=1).delete()# 删除所有记录
session.query(User).delete()# 提交数据,将数据保存到数据库中
session.commit()
# 关闭会话
session.close()
3.4.3 更改数据
Session = sessionmaker(db)
session = Session()
users = User.query.all()# 更新满足给定条件'id=1'的第一条记录
user = session.query(User).filter_by(id=1).first()
user.name = 'new name'# 更新所有记录
session.query(User).update({'name': 'new name'})# 提交数据,将数据保存到数据库中
session.commit()
# 关闭会话
session.close()
参考
[1] SQLAlchemy官网
[2] 《SQLAlchemy查询语句(新手入坑)》
[3] 《python—sqlalchemy简单使用方法,一对多,多对多,双向关系教程》
[4] 《Python SQLalchemy 基础操作之数据库增删改查》
[5] 《Python ORM之SQLAlchemy全面指南》