两分钟了解Python之SQLAlchemy框架的使用

2021-08-18 11:14:10 浏览数 (1)

您好,我是码农飞哥,感谢您阅读本文!本文将主要介绍一款应用于Python语言中的ORM框架SQLAlchemy。ORM的是Object-Relational Mapping,作用是把关系数据库的表结构映射到对象上。

安装

本demo使用的是MySQL数据库,ORM框架是SQLAlchemy框架。所以,我们首先需要通过Python的包管理工具安装需要的包。

  1. 安装MySQL数据库驱动 我们需要安装Python的MySQL驱动来连接MySQL服务器,MySQL官方提供了mysql-connector-python驱动,但是在安装的时候需要给pip命令加上参数 --allow-external。安装命令如下:
代码语言:javascript复制
pip install mysql-connector-python --allow-external mysql-connector-python

如果该命令安装失败则可以尝试下如下命令:

代码语言:javascript复制
pip install mysql-connector
  1. 安装SQLAlchemy 安装好MySQL驱动之后,接下来就是安装SQLAlchemy模块。同样是通过pip命令安装。
代码语言:javascript复制
pip install sqlalchemy

环境

软件

版本

Python

3.6.7

mysql-connector-python

8.0.22

SQLAlchemy

1.3.22

使用

MySQL驱动和SQLAlchemy模块安装好之后,我们的准备工作就做完了,就下来就是使用了SQLAlchemy框架了。

1. 待测试的数据表

该脚本创建一个名为job的数据库,然后在该数据库中创建一个名为job_user的表。接着向表中插入两条账号信息。执行该脚本就准备好了测试数据。

代码语言:javascript复制
CREATE database if NOT EXISTS `job` default character set utf8mb4 collate utf8mb4_unicode_ci;
use `job`;
CREATE TABLE `job_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL COMMENT '账号',
  `password` varchar(50) NOT NULL COMMENT '密码',
  PRIMARY KEY (`id`),
  UNIQUE KEY `i_username` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `job_user`(`id`, `username`, `password`) VALUES (1, 'admin', '123');
INSERT INTO `job_user`(`id`, `username`, `password`) VALUES (2, 'zhangsan', '345');

2. 导入SQLAlchemy,并初始化DBSession

代码语言:javascript复制
# 导入相关的包
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# 创建对象的基类
Base = declarative_base()
# 初始化数据库连接
engine = create_engine('mysql mysqlconnector://root:123@localhost:3306/job')
# 创建DBSession类型
DBSession = sessionmaker(bind=engine)
# 定义User对象
class User(Base):
    # 表的名字
    __tablename__ = 'job_user'
    # 表的结构
    id = Column(int(11), primary_key=True)
    username = Column(String(20))
    password = Column(String(20))
#将对象转成dict字典
def to_dict(self):
    return {c.name: getattr(self, c.name, None)
            for c in self.__table__.columns}
Base.to_dict = to_dict

如上代码,主要做了如下三件事情:

  1. 导入SQLAlchemy框架的相关类。
  2. 初始化数据连接,创建DBSession类型
代码语言:javascript复制
数据库类型 数据库驱动名称://用户名:口令@机器地址:端口号/数据库名
mysql mysqlconnector://root:123@localhost:3306/job

就是说数据库类型是mysql,数据库驱动的名称是mysqlconnector,连接的用户名是root,连接的密码是123,机器地址是:localhost,端口号是:3306,数据库名称是job。这个连接的格式是固定的。接着通过如下语句来创建DBSession类型:

代码语言:javascript复制
DBSession = sessionmaker(bind=engine)
  1. 定义User对象,这个对象里的属性与job_user表里的字段相对应。

3. 插入数据

插入数据的操作其实就是创建一个待插入的User对象,然后将该User对象放入session(会话)中进行提交。

代码语言:javascript复制
#创建session对象
session = DBSession()
# 创建新User对象
new_user = User(id=3,username='ceshi',password='456')
# 添加到session
session.add(new_user)
# 提交即保存到数据库:
session.commit()
# 关闭session
session.close()

4. 查询数据

根据主键获取记录

根据主键查询可以直接调用get方法,

代码语言:javascript复制
user = session.query(User).get(1)
print(user and user.to_dict())

就可以直接得到如下结果:

代码语言:javascript复制
{'id': 1, 'username': 'admin', 'password': '123'}

当然也可以这样写:

代码语言:javascript复制
user = session.query(User) 
    .filter(User.id == 1) 
    .first()
print(user and user.to_dict())

上面get的方法比较简洁,只适用于主键查询,下面filter的方法比较通用,适用于所有字段的查询。其中first()的意思是返回查询结果中的第一条。

代码语言:javascript复制
#all()方法是返回所有的查询结果
users = session.query(User) 
    .filter(User.id == 1) 
    .all()
#one()方法是只获取一条记录,如果找不到记录或者多条都会报错
user = session.query(User) 
    .filter(User.id == 1) 
    .one()
AND查询

在实际项目中,我们查询数据通常是多条件查询,那么多条件查询的代码该怎么写呢?

代码语言:javascript复制
user = session.query(User) 
    .filter(User.username == 'admin',
            User.password > '123') 
    .all()

上面的代码的效果等同于下面的SQL语句;

代码语言:javascript复制
select * from job_user where username='admin' and password='123'
返回记录条数 count()
代码语言:javascript复制
#返回记录条数 count()
count = session 
    .query(User) 
    .filter(User.id == 3) 
    .count()
print(count)
将记录按照某个字段进行排序 order_by()
代码语言:javascript复制
users = session 
    .query(User.id, User.username) 
    .filter(User.id > 2) 
    .order_by(User.id.desc()) 
    .all()
查看记录是否存在 exist()
代码语言:javascript复制
from sqlalchemy.sql import exists
is_exist = session 
    .query(exists().where(User.id > 10)) 
    .scalar()
OR查询
代码语言:javascript复制
#需要引入or_函数
from sqlalchemy import or_
users = session.query(User) 
    .filter(or_(User.id == 1,
                User.username =='zhangsan')) 
    .all()
IN查询
代码语言:javascript复制
users = session.query(User) 
        .filter(User.id.in_([1, 3, 5])) 
        .all()
模糊查询
代码语言:javascript复制
# 查询用户名包含「zhang」的用户账号
books = session.query(User) 
    .filter(User.username.contains('zhang')) 
    .all()

5. 更新数据

更新数据的操作其实就是首先查出待更新的数据,然后调用update方法更新成新数据。

代码语言:javascript复制
session = DBSession()
new_user = session.query(User).filter(User.id == 2).update({"username": "lisi"})
session.commit()
session.close()

这里是将id等于2的那条数据的用户名由zhangsan改成lisi。同样的还是先创建session对象,然后提交session,最后关闭session。

6. 删除数据

删除数据与更新数据类似。也是先查出待删除的数据,如果存在则删除,这是物理删除。下面的语句是删除id等于3的用户账号。

代码语言:javascript复制
# 创建session对象
session = DBSession()
old_user = session.query(User).get(3)
# 删除文件
session.delete(old_user)
# 提交即保存到数据库:
session.commit()
session.close()

总结

本文首先介绍了SQLAlchemy框架的安装,接着介绍了如何通过该框架对数据库表进行增删改查,重点介绍了常用查询,查询的方法众多,其中使用最多的方法就是filter方法,我们的查询条件都是通过该方法传入的。希望对读者朋友们有所帮助。

0 人点赞