一、SQLAlchemy介绍

  SQLAlchemy 是 Python SQL 工具包和对象关系映射器,为应用程序开发人员提供 SQL 的全部功能和灵活性。

  SQLAlchemy支持SQLite、PostgreSQL、Oracle、MySQL、MariaDB、Microsoft SQL Server等多种数据库。

二、SQLAlchemy安装

  

  我安装的版本是:SQLAlchemy==2.0.29。注意SQLAlchemy2.x以上的版本和1.x版本差别还是挺大的,注意版本。

  因为SQLAlchemy不能直接操作数据库,还需要python中的pymysql第三方库,所以还需要安装pymysql

  

  PyMySQL==1.1.0.

三、创建测试数据库

  创建一个用于测试的数据库

  

  其中sqlalchemydb就是测试数据库

四、封装SQLAlchemyDB类

  在python项目根目录下创建一个sqlalchemy_db.py文件,当然你也可以在其他目录下创建。其中内容如下:

  

  说明1:该文件sqlalchemy_db.py的作用是封装一个SQLAlchemy的类,为实例化sqlAlchemy对象做准备

  说明2:self.engine是连接数据的引擎设置,只有设置了engine,我们才能通过sqlalchemy对象操作数据库

  说明3:self.session可以理解为数据库的操作对象,我们对数据库的操作都是基于该session实现的。

  说明4:engine参数解释

  1. 参数url:SQLAlchemy要连接的数据库地址,其格式为:数据库类型+数据库驱动://数据库用户:数据库密码@数据库地址:端口号/数据库名称?编码方式
  2. 参数convert_unicode:按照指定的编码方式对字符串进行编码解码
  3. 参数isolation_level:设置事务的隔离界别
  4. 参数pool_recycle:设置回收链接的时间,单位毫秒
  5. 参数pool_pre_ping:每次连接前预先ping一下
  6. 参数pool_size: 链接池中保持数据库连接的数量,默认是5
  7. 参数max_overflow :当链接池中的连接数不够用的时候,允许额外再创建的最大链接数量,默认是10
  8. pool_timeout:排队等数据库链接时的超时时间
  说明5: scoped_session创建的session是线程安全的。

五、创建model模型

  5.1 SQLAlchemy支持的数据类型

    • Integer:整形
    • String:字符串
    • Float:浮点型
    • DECIMAL:定点型
    • Boolean:bool
    • Date:日期类型
    • DateTime:日期+时间类型
    • Time:时间类型
    • Enum:枚举类型
    • Text:文本类型
    • LongText:长文本类型

  5.2 SQLAlchemy字段常用的约束

    • default:默认值
    • nullable:是否可空
    • primary_key:是否为主键
    • unique:是否唯一
    • autoincrement:是否自动增长
    • name:该属性在数据库中的映射字段

  5.3 创建测试的model.py文件

    在项目的根目录或者你需要的地方创建一个model.py文件,内容如下:

    

    说明1:为了测试效果,我们在这个model类中尽可能的多展示了不同字段的使用

    说明2:Base.metadata.create_all() 会将我们的模型自动映射到数据库中,当然也可以手动去数据库中创建表

    说明3:我们写好的这个model类暂时还没有使用呢 。

六、创建测试文件

  在项目根目录下或者你需要的地方创建一个test.py文件,内容如下:

  

  这时我们在test.py中就只引入mysql_db和TestModel,其他的先不写,然后使用python test.py运行该脚本,就会发现我们的model模型,已经同步到数据库中了

  

七、添加测试数据

  7.1 单条添加数据

    修改test.py文件如下,然后python test.py执行

    

    执行之后,我们去数据库查看结果如下:

    

    说明1:create_time,update_time,is_delete都是有默认值的字段,如果不设置,会自动显示默认值。

    说明2:money字段总长度时9位,但是可以少于9位,不能多于9位,小数部位不足时补0

  7.2 批量添加数据

    再来演示一下批量增加数据,代码如下还是在test.py中

    

    执行后的结果如下:

    

八、修改删除

  8.1 修改

    刚才已经演示了增加数据的代码,下面我们看一下修改,代码如下,还是在test.py文件中

    

    查看一下数据库

    

  8.2 删除

    可以看到姓名和性别已经修改成功。再来测试一下删除数据

    

    

    可以看出,数据库中已经没有id=1的数据了

九、查询

  在进行查询测试之前,先往数据库中添加一下测试数据

  

  9.1 query关键字

    在做查询的时候我们通常query关键字,它类似于SQL中select 关键字,query参数通常可以填写三类参数

    • model模型对象:指定查找这个模型中所有的字段
    • model模型对象中的属性:可以指定只查找某个model中的几个属性字段
    • 聚合函数:func.count(统计行的数量),func.avg(求平均数),func.max(求最大值),func.min(求最小值),func.sum(求和)

    

    查看一下打印结果

    

    说明1:在做查询的时候 .first() 表示查询第一个满足条件的数据

    说明2:在做查询的时候 .all() 表示查询所有数据

    说明3:如果不是查询全部字段,只查询部分字段或者聚合函数的话,结果返回的是一个元组,通过下标取数据即可

  9.2 filter关键字

    过滤是数据提取的一个很重要的功能,以下对一些常用的过滤条件进行解释,并且这些过滤条件都是只能通过filter方法实现,常用的方法有

    • 相等: ==
    • 不相等: !=
    • 模糊查询:like(%xx$)
    • 包含:in_()
    • 不包含:~ in_() 注意 ~不是直接加在in前面的,注意看代码示例
    • 空:==None 或者 is_(None)
    • 不为空: !=None 或者 isnot(None)
    • 并且: and_()或者也可以使用逗号连接多个条件
    • 或者:or_()

    

    打印结果如下:

    

  9.3分页查询

    方式1:使用limit+offset实现

    

    查询结果为:

    

    方式2:使用slice

    

    输出结果为:

    

十、排序

  

  输出结果为:

  

.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 500px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 500px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 700px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }
.mac { width: 10px; height: 10px; border-radius: 5px; float: left; margin: 10px 0 0 5px }
.b1 { background: rgba(224, 68, 62, 1); margin-left: 10px }
.b2 { background: rgba(222, 161, 35, 1) }
.b3 { background: rgba(26, 171, 41, 1) }
.warpper { background: rgba(18, 18, 18, 1); border-radius: 5px; width: 720px; margin-left: 27px }

SQLAlchemy详解的更多相关文章

  1. SqlAlchemy使用详解

    python之sqlalchemy创建表的实例详解 通过sqlalchemy创建表需要三要素:引擎,基类,元素 from sqlalchemy import create_engine from sq ...

  2. SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解

    SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...

  3. SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解

    SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...

  4. flask基础之session原理详解(十)

    前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...

  5. OpenStack计费项目Cloudkitty系列详解(一)

    云计算是一种按需付费的服务模式,虽然OpenStack前期在计量方面走了些“弯路”,但现在的ceilometer.gnocchi.aodh.panko项目的稳步并进算是让其峰回路转.然而,目前来看Op ...

  6. celery详解

    目录 Celery详解 1.背景 2.形象比喻 3.celery具体介绍 3.1 Broker 3.2 Backend 4.使用 4.1 celery架构 4.2 安装redis+celery 4.3 ...

  7. Python 定时任务框架 APScheduler 详解

    APScheduler 最近想写个任务调度程序,于是研究了下 Python 中的任务调度工具,比较有名的是:Celery,RQ,APScheduler. Celery:非常强大的分布式任务调度框架 R ...

  8. PyJWT 详解

    1.首先,我们需要先了解 JWT 的概念,所以我们先看pyjwt的官网 https://jwt.io/ 2.对于官方 JWT 有两篇博文写的不错分别如下: https://blog.csdn.net/ ...

  9. 13-flask博客项目之restful api详解2-使用

    13-flask博客项目之restful api详解1-概念 13-flask博客项目之restful api详解1-概念 Flask-RESTful学习网站 英文:https://flask-res ...

  10. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

随机推荐

  1. linux 命令行使用codeql

    目录 CodeQL 概述 安装 直接使用在线查询(lgtm) vscode使用codeql 下载 库文件 测试 linux控制台运行 下载 安装 创建数据库 编写QL查询数据库 简单解释 CodeQL ...

  2. ArrayList学习总结

    1.ArrayList简介[1] ArrayList实现了List接口.ArrayList的方法实现和vector相似,只是线程不安全的. ArrayList的 size.isEmpty.get.se ...

  3. Java 多线程---线程优先级

    Java 实例 - 线程优先级设置 以下实例演示了如何通过setPriority() 方法来设置线程的优先级: 1 SimplePriorities.java 文件 2 public class Si ...

  4. idea dev 分支合并到 master 流程

    合并分支前要全部提交 包括config.js 要不merge时候很麻烦 1 切换到master分支 Checkout 2 Merge into Current 3 commit push 4 切换回d ...

  5. 芯片公司Dialog产品调研简报

    一 公司简介: Dialog半导体有限公司的总部位于伦敦,设有一个全球销售.研发和营销部.2013年,公司实现了9.10亿美元的营业收入,是欧洲增长速度最快的公共半导体公司之一.   二 芯片型号: ...

  6. Android 桌面小组件使用

    原文: Android 桌面小组件使用-Stars-One的杂货小窝 借助公司上的几个项目,算是学习了Android桌面小组件的用法,记下踩坑记录 基本步骤 1.创建小组件布局 这里需要注意的事,小组 ...

  7. Web服务器通信原理

    Web服务器通信原理 1.区分系统 2.DOS系统 3.IP地址 4.域名.DNS 5.端口 6.HTTP协议 7.Web容器 8.整个流程 一.区分系统 主要三个系统Windows.Linux.Ma ...

  8. Grails批改默认启动端口

    Grails修改默认启动端口 Grails默认启动端口号是8080,有几种修改的方式: 一.在官网文档中有介绍: grails -Dserver.port=8090 run-app -Dserver. ...

  9. 百度 Linux 运维工程师面试真题

    百度 Linux 运维工程师面试真题 百度面了好久了,两个月了,估计都快成馊面了,一跟面条在走边边一不小心掉进了大海,于是 就有了汤面_经历非技术总结就两句话,幸运的是在朋友的帮助下顺利通过笔试,还认 ...

  10. 如何打造一个花里胡哨的Github个人主页?

    1.介绍 2.使用 2.1.创建一个同名仓库 2.2.引用模板 2.3.为内容添加有趣模块 2.3.1.徽章badge 2.3.2.waka 时间展示 2.3.3.展示 GitHub stars 等信 ...