前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两分钟了解Python之SQLAlchemy框架的使用

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

作者头像
码农飞哥
发布2021-08-18 11:14:10
9860
发布2021-08-18 11:14:10
举报
文章被收录于专栏:好好学习

您好,我是码农飞哥,感谢您阅读本文!本文将主要介绍一款应用于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方法,我们的查询条件都是通过该方法传入的。希望对读者朋友们有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农飞哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 环境
  • 使用
    • 1. 待测试的数据表
      • 2. 导入SQLAlchemy,并初始化DBSession
        • 3. 插入数据
          • 4. 查询数据
            • 根据主键获取记录
            • AND查询
            • 返回记录条数 count()
            • 将记录按照某个字段进行排序 order_by()
            • 查看记录是否存在 exist()
            • OR查询
            • IN查询
            • 模糊查询
          • 5. 更新数据
            • 6. 删除数据
            • 总结
            相关产品与服务
            数据库
            云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档