python自学之《21天学通Python》(13)——第16章 数据库编程
数据库指的是以一定方式存储在一起、能为多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。而我们平时所说的数据库实际上是包含了数据库管理系统(DBMS)的,数据库管理系统是为管理数据库而设计的软件系统,它一般具有查询、存储、截取、安全保障和备份等功能。
16.1 Python数据库应用程序接口
为了使Python语言对数据库访问具有友好的通用界面,增强Python语言使用数据库的可移植性等原因,Python对于关系数据库的访问接口制定了一个标准,即Python Database API Specification v2.0,简称PEP249,其参考资料见https://www.python.org/dev/peps/pep-0249。
操作数据的相关第三方模块需要遵从这一规范,但并不是所有第三方模块都严格遵从的。在遵从这一规范的基础上,第三方模块还可以添加一些特别的或有益于用户使用的功能。API规范中指定了访问数据的两种主要的对象,即连接对象和游标对象。本节介绍这两个对象及其使用方法。
16.1.1 数据库应用程序接口概述
DB-API 2.0连接对象是用来管理数据库连接的对象,它由数据库模块中提供的一个模块级函数connect()返回的对象。而函数connect()的参数会因访问的数据库不同而有所不同,但是通常包含如数据源名称、用户名、密码、主机名、数据库名等基础连接信息。
16.1.2 数据库游标的使用
注意: 数据库编程接口具有共性的一面,即大部分数据库操作都是遵循的,但对于具体的数据库也可能有所不同,你应参考其连接库的相关帮助文档。
16.2 Python操作SQLite3数据库
Python3.x版本的标准库已经内置了sqlite3模块,它就是支持SQLite3数据库的访问和相关数据库操作,要操作SQLite3数据库可以先导入其模块即可。
16.2.1 SQLite3数据库简介
SQLite是一个开源的嵌入式关系数据库,它在2000年由D.RichardHipp发布,它的减少应用程序管理数据的开销,SQLite可移植性好,很容易使用,很小,高效而且可靠。作为嵌入式数据库直接在应用程序进程中运行,提供了零配置(zero-configuration)运行模式,并且资源占用非常少。
SQLite3数据库是将整个数据库(定义、表、索引和数据)都存储在主机端上单一的一个文件中,所以体积很小,一些基本的信息系统都使用它作为基础的数据库。
嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。SQLite的数据库权限只依赖于文件系统,没有用户账户的概念。SQLite有数据库级锁定,没有网络服务器。它需要的内存和其他开销很小,适合用于嵌入式设备。你需要做的仅仅是把它正确地编译到你的程序。
程序库实现了多数的SQL-92标准,包括事务,就是代表原子性、一致性、隔离性和持久性(ACID)。触发器和多数的复杂查询,不进行类型检查,你可以把字符串插入到整数列中。例如,某些用户发现这是使数据库更加有用的创新,特别是与无类型的脚本语言一起使用的时候。其他用户认为这是主要的缺点。
多个进程或线程可以同时访问同一个数据而没有问题。可以同时平行读取同一个数据库。但同一时间只能有一个进程或线程进行数据写入;否则会写入失败并得到一个错误消息(或者会自动重试一段时间,而这重试时间的长短是可以设置的)。
16.2.2 SQLite3数据库操作实例
使用Python标准库的sqlite3包来操作SQLite3数据库,依据DB-API2.0规范,主要有以下几个步骤:
其中,database就是用字符串的形式指定数据库的名称,如果数据库文件位置不是当前目录,则必须要写出其相对或绝对路径。还可以用“:memory:”表示使用临时放入内存的数据库,而当程序退出时,数据库中的数据也就不存在了。
5.关闭游标对象和数据库连接(close())。
注意:数据库操作之后,应及时调用其close()方法关闭数据库连接,以减轻数据库服务器的压力。
【代码说明】代码中首先定义了两个用于生成随机字符串作为数据库记录数据的函数,还有两个分别通过遍历cursor、调用cursor的fetchall()方法来获取数据库表中所有记录并输出的函数。然后在主程序中,依次通过建立连接、获取连接的cursor,之后通过cursor的execute()、executemany()等方法来执行SQL语句,以达到插入一条记录、插入多条记录、更新记录和删除记录。最后依次关闭游标和数据库连接。
注意: 使用游标的方法来执行SQL语句时,其语句中的数据采用占位符(?)的方式。为了防止注入式攻击数据库,一般不采用字符串拼接的方式,而是采用参数方式。
【运行效果】如图16.1所示,创建了一张表之后,首先插入一条新记录并显示,其次插入多条记录并显示,最后分别更新和删除了一条记录。你可以对比每个操作执行前后显示的数据库表中的数据来了解操作后的数据或记录的变化。
注意: 更新数据库后应该调用connect对象的commit()方法来保存更新结果。
16.3 Python操作MariaDB数据库
MariaDB数据库是一种开源的数据库,它是MySQL数据库的一个分支,因为历史原因,有不少用户担心MySQL数据库会闭源,所以MariaDB已经发展成为替代MySQL数据库主要的开源数据库之一。本节介绍的是在Windows下运用MySQL的官方第三方库来操作MariaDB数据库。
16.3.1 MariaDB数据库简介
除了具有MySQL数据库系统的特点外,还有自身的一些特性:
1.兼容性
MariaDB与MySQL在同一分支保持最新的版本,在大多数方面,MariaDB与MySQL几乎一样。所有的命令、接口、库和APIs存在于MySQL,也存在于MariaDB。切换到MariaDB不需要转换数据库。MariaDB是可以快切换并替代MySQL的。此外,您可以利用MariaDB许多不错的新特性。
2.速度更快
MariaDB增加了很多优化及增强功能,在数据的安全复制、索引、字符集转换等方面具有更好的性能。
3.采用线程池连接查询
用线程池替代了每个连接一个线程,使用查询时对数据的锁定代价降低,在大量的连接下性能有明显提升。
4.安全性
在MySQL的基础上维护自己的一套安全补丁。对于每个MariaDB的发布版本,开发人员将合并所有MySQL的安全补丁,如果有必要,我们还会增强它们。
目前,维基百科、Fedora、Slackware Linux、Red Hat等目前都已经迁移到MariaDB数据库。
16.3.2 建立MariaDB数据库操作环境
MariaDB数据库安装也很简单,你可以下载其安装版本的msi包之后,直接运行安装即可。也可以根据你的计算机操作系统下载其对应版本的压缩包,解压后执行命令安装或在控制台直接应用。本节简单介绍使用64位版本的压缩包解压后在控制台直接启动方法。
首先到以下地址下载压缩包并解压到某目录中(此处以d:\mariadb为例):
注意: 启动后若Windows系统弹出如图16.3所示的安全警报窗口,请单击“允许访问”,否则无法通过网络访问数据库。
注意: 用以上控制台方式启动MariaDB数据库后,默认的数据库root用户的密码为空,你可以用以下命令给root用户添加一个新密码:
注意: 此处安装成功后,数据库服务器并不会自动启动,应使用以下命令启动MariaDB数据库。
16.3.3 MariaDB数据库操作实例
16.4 Python操作MongoDB数据库
MongoDB数据库也是一种开源的跨平台的数据库,与SQLite3、MariaDB不同的是:MongoDB是一种noSQL (not only SQL)非关系型数据库,MongoDB数据库的操作方法与它们也是大相径庭的。
16.4.1 MongoDB数据库简介
MongoDB是一种强大、灵活、可扩展的数据存储方式,它扩展了关系型数据库的大量有用功能。它的主要特点有:
MongoDB数据存储没有模式:对于关系型数据库来说,只要建立一个关系,即一张表,那么其中的数据类型基本上就定格了。MongoDB数据存储基本单元是“文档”(相对于关系型数据库中的记录),每个文档的模式可以不同,不仅数据类型可以不同,其结构也不相同。
MongoDB具有很强的易扩展性:它所采用的文档数据模型可以自动在服务器之间分割数据,而且其服务器可以集群以平衡服务器的压力。集群的服务器可以自动切换备份的服务器,还可以自动集成和配置新节点。
MongoDB支持高并发读写:MongoDB可以通过集群来提高读写性能,甚至带可以建立读写分享的集群服务器。
MongoDB支持海量存储:内置GridFS,支持大容量的存储,GridFS是一个出色的分布式文件系统,可以支持海量的数据存储。内置了GridFS了MongoDB,能够满足对大数据集的快速范围查询。
16.4.2 建立MongoDB数据库操作环境
由于MongoDB数据库是一种开源的跨平台的数据库,所以你可以自由下载和使用,其下载地址为:
http://www.mongodb.org/downloads
下一节介绍MongoDB数据库基础及用客户端来操作它。
16.4.3 MongoDB数据库基础
与关系型数据库相比,作为非关系型的MongoDB数据库的有关概念是不同的,如图16.9所示。
对应一般关系型数据的表和记录,在MongoDB中分别叫集合和文档。记录是表中的一行,文档相当于表的“一行”,但它可以有灵活的嵌套结构,比关系型数据库中的一条记录要复杂得多。
它们不是同一个文档,但很多情况下键的顺序是无关紧要的,而且有些编程语言如本书介绍的Python也是这样的。
文档中的字符串是区分大小写的,字符串中的字符可以是除了以下情况的所有UTF-8字符:
要实现对数据库的管理等操作,可以使用上一节所讲的mongo.exe客户端来操作MongoDB,只要直接在命令提示符下运行这个程序,它就会作为客户端默认连接本机的27012(MongoDB默认服务端口),如图16.10所示,启动成功后出现“>”,就是其客户端的提示符。
MongoDB的操作很简练,在使用数据库和集合前根本不需要先建立,而是当执行了插入数据时会自动建立对应的集合和表。而关系型数据库要使用数据和表时需要先用SQL语句建立。如上操作实例演示,事先并没有建立test数据库,却可以直接用“usetest”命令切换;同样没有先创建集合stu就可以直接使用db.stu.insert()来向stu集合插入文档。
16.4.4 MongoDB数据库操作实例
要用Python操作MongoDB数据库,就需要安装pymongo这个第三方库。你可以从以下任一个网址下载它,因为后一节的测试环境要求2.8版本的pymongo,建议下载安装2.8版本:
注意: 以上步骤还是很多的,在实际编程中以上步骤中的2、3、4可以用一句代码即可解决。
其对应的基本代码如下:
from pymongo import MongoClient
MongoClient()实际是实例化类MongoClient的操作,其基本初始化参数包括:
host 连接的数据库服务器主机;
port 连接的数据库服务器服务端口。
host默认值就是本地主机,port的默认值为MongoDB数据库服务器默认端口27017。所以以下的测试中可以不带参数来实例化类MongoClient。
注意: insert_one()、insert_many()和find_one()是在3.0版添加的,而在稳定的2.8版只使用insert()和fin()方法。
16.4.5 用对象关系映射(ORM)工具操作MongoDB数据库
ORM是对象关系映射(Object Relational Mapping,或O/RM)的简称,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
从另外一个角度来看,在面向对象编程语言中使用的是对象,而对象中的数据要保存到数据库中,或数据库中的数据用来构造对象。要从数据库中提取数据并构造对象或将对象数据存入数据库,有很多代码是重复的,而且很多功能完全自己实现那就是“重复造轮子”。所以就诞生了ORM,它使得从数据库中提取数据来构造对象或将对象数据保存(持久化)到数据库中实现起来更简单。
通过ORM框架来操作数据只需要通过操作类就可以实现一切功能。
16.5 小结
本章首先介绍了Python语言的数据库基础——DB-API 2.0中的连接对象和游标对象,然后介绍通过它们来访问或操作内嵌的SQLite3数据库、MariaDB数据库等关系型数据库,并各举出一个包含连接数据库、插入、修改、删除数据库中数据的一个实例,此外还介绍了MariaDB数据环境的建立。最后重点介绍了Python操作非关系型的MongoDB数据库的基本方法,包括建立其数据库服务器测试环境、MongoDB数据库基础知识及客户端程序的使用、用pymongo操纵数据和用ORM框架mongoengine来操纵数据库。通过学习本章你应该掌握Python的基本数据库应用程序接口及其使用方法,并能使用它们连接和操纵数据库中的信息。
相关文章:

python自学之《21天学通Python》(13)——第16章 数据库编程
数据库指的是以一定方式存储在一起、能为多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。而我们平时所说的数据库实际上是包含了数据库管理系统(DBMS)的,数据库管理系统是为管理数据库而设计的软件系统,它一…...

[架构之路-118]-《软考-系统架构设计师》-软架构设计-11-可靠性相关设计
第11节 可靠性相关设计11.1 可靠性基本概念可靠性工程是研究产品生命周期中故障的发生、发展规律,达到预防故障,消灭故障,提高产品可用性的工程技术。信息系统的可靠性是指系统在满足一定条件的应用环境中能够正常工作的能力,可以…...

电阻串联的作用
电阻串联常见作用 第一个作用是:阻抗匹配: 因为信号源的阻抗很低,跟信号线之间阻抗不匹配,串上一个电阻后,可以改善匹配情况,以减少反射,避免振荡等。 常见的阻抗匹配方法 1、使用变压器来做…...

leetcode 1675. Minimize Deviation in Array(最小化数组偏差)
数组里面有n个正整数,里面的数字可以无限次进行如下操作: 1.偶数可以除以2 2.奇数可以乘以2 数组中任意两元素差的最大值称为偏差。 把数组中的元素进行上面2种操作,使偏差最小。 思路: 数组中现有2种数字,一种是奇数…...

特征向量中心度(eigenvector centrality)算法原理与源码解析
前言 随着图谱应用的普及,图深度学习技术也逐渐被越来越多的数据挖掘团队所青睐。传统机器学习主要是对独立同分布个体的统计学习,而图深度学习则是在此基础上扩展到了非欧式空间的图数据之上,通过借鉴NLP和CV方向的模型思想,衍生…...

Vue3 中组件的使用(上)
目录前言:一、什么是组件二、注册组件1. 全局注册2. 局部注册二、传递数据【父 -> 子】1. 字符串数组的形式2. 对象的形式三、组件事件【子 -> 父】1. 字符串数组式声明自定义事件2. 【子组件】触发组件事件3. 【父组件】监听子组件自定义事件4. 组件事件例子…...

spring-boot、spring-cloud、spring-cloud-alibaba版本对应
一、查询 spring-boot(spring-boot-starter-parent) 版本号 https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent 二、查询 spring-cloud(spring-cloud-dependencies) 版本号 https://mvnrepository.com/artifact/org.springframework…...

【沐风老师】3DMAX一键楼梯脚本插件StairGenerator使用教程
3DMAX一键楼梯插件StairGenerator,不需要花费太多的时间,轻松从2D平面图生成3D楼梯模型,生成的楼梯模型细节丰富真实。 【主要功能】 1.简单:轻松实现2D到3D建模。 2.具有最详细三维结构的台阶平面图。 3.楼梯各部件完全参数化…...

OpenShift 简介
OpenShift 是红帽 Red Hat 公司基于开源的云平台,是平台即服务(PaaS),是一种容器应用平台。允许开发人员构建、测试和部署云应用。该系统是在 K8S 核心之上添加工具,从而实现更快的应用开发、部署及扩展。 在 OpenShi…...

netty自定义封包实现
文章目录说明分享内置编码器和解码器解码器编码器代码实现创建核心类消息实体类自定义编码类自定义解码类服务端ServerHandler入口类客户端ClientHandler入口类测试参考总结说明 netty是java重要的企业级NIO,使用它可以快速实现很多功能通信功能如:http、…...

ORA error集锦
1、oralce 数据客户端需要安装的问题 保存信息为: “无法连接到数据库,因为数据库客户端软件无法加载。确保已正确安装并配置数据库客户端软件” 从百度网盘下载,并安装win32 oracle client 安装包 2、ORA错误 “执行异常,ORA-00911: inval…...

格雷码的实现
格雷码:任意两个相邻的二进制数之间只有一位不同 想必通信专业的学生应该都接触过格雷码,它出现在数电、通信原理等课程里。 如下图所示一个四位格雷码是什么样子的: 格雷码的特点: 其最大的特点是任意上下相邻的两个码值间&am…...

快到金3银4了,准备跳槽的可以看看
前两天跟朋友感慨,今年的铜九铁十、裁员、疫情导致好多人都没拿到offer!现在已经12月了,具体明年的金三银四只剩下两个月。 对于想跳槽的职场人来说,绝对要从现在开始做准备了。这时候,很多高薪技术岗、管理岗的缺口和市场需求也…...

最新BlackArch发布,提供1400款渗透测试工具
近日,BlackArch Linux新版本发布,此版本为白帽子和安全研究人员提供了大约1400款渗透测试工具,如果你是一位白帽子或者安全研究人员,这个消息无疑会让你很感兴趣。BlackArch Linux是一款基于Arch Linux的发行版,主要面…...

重走前端路JS进阶篇:This 指向与箭头函数
JavaScript 高级 This 指向规则 案例 function foo() {console.log(this)}// 1 调用方式1foo();// 2 调用方式2 放入对象中调用var obj {name: "why",foo: foo}obj.foo()// 调用方式三 通过 call/apply 调用foo.call("abc")指向定义 this 是js 给函数的…...

Python基础:函数式编程
一、概述 Python是一门多范式的编程语言,它同时支持过程式、面向对象和函数式的编程范式。因此,在Python中提供了很多符合 函数式编程 风格的特性和工具。 二、lambda表达式(匿名函数) 除了 函数 中介绍的 def语句,P…...

【YBT2023寒假Day14 C】字符串题(SAM)(树链剖分)(线段树)
字符串题 题目链接:YBT2023寒假Day14 C 题目大意 对于一个字符串 S 定义 F(S) 是 fail 树上除了 0 点其它点的深度和。 G(S) 是 S 每个子串 S’ 的 F(S’) 之和。 然后一个空串,每次在后面加一个字符,要你维护这个串的 G 值。 思路 考虑…...

Tailwind CSS 在Vue中的使用
什么是Tailwind CSS? Tailwind CSS 是一个功能类优先的 CSS 框架,它集成了诸如 flex, pt-4, text-center 和 rotate-90 这样的的类,支持 hover 和 focus 样式,它们能直接在脚本标记语言中组合起来,构建出任何设计。 …...

三层楼100人办公网络如何规划设计实施(实战案例)
如何设计组网 1.采用防火墙+三层交换机+二层POE交换机+AP的方案 2.三层交换机作为网络的核心,提供网络的配置、划分和各个VLAN间的数据交换,而每个VLAN由二层交换机组建 3.网络主干设备的选型,建议网络主干设备或核心层设备选择具备第3层交换功能的高性能主干交换机。 4…...

Redis:实现全局唯一ID
Redis:实现全局唯一ID一. 概述二. 实现(1)获取初始时间戳(2)生成全局ID三. 测试为什么可以实现全局唯一?其他唯一ID策略补充:countDownLatch一. 概述 全局ID生成器:是一种在【分布式…...

webpack打包基本原理——实现webpack打包核心功能
webpack打包的基本原理 核心功能就是把我们写的模块化代码转换成浏览器能够识别运行的代码,话不多说我们一起来了解它 首先我们建一个空项目用 npm init -y 创建一个初始化的,在跟目录下创建src文件夹,src下创建index.js,add.js…...

git的使用(终端输入指令) 上
git目录前言1.创建仓库2.创建文件和修改数据状态分区3 .删除、撤销重置 、和比较前言 今天带大家手把手敲一遍 git 流程: 安装一下git(详细观看我之前发的git文档࿰…...

react定义css样式,使用less,css模块化
引入外部 css文件 import ./index.css此时引入的样式是全局样式 使用less 安装 npm i style-loader css-loader sass-loader node-sass -D生成config文件夹 npm run eject配置 以上代码运行完,会在根目录生成config文件夹 进入 config > webpack.config.js 查找…...

基于JavaWeb的学生管理系统
文章目录 项目介绍主要功能截图:登录用户信息管理院系信息管理班级信息管理新增学生课程管理成绩管理部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系�…...

win11右键新建菜单添加选项
需要操作 2 处注册表, 以下以在右键新建菜单中添加 .html 为例 在主键 HKEY_CLASSES_ROOT 中,搜索 .html 找到后 ,右键点击它,选 新建 ->项, 在这里插入图片描述 项目名字是:ShellNew 新建后&#x…...

leetcode Day5(卡线复试,放弃版)
Day5 最后一个单词长度(要求最后一个,可以反向计数) int lens.length()-1; while(s.charAt(len)){len--;//最后是一个空格,就是无字符时 } int wordlen0;//记录字符长度 /*charAt() 方法用于返回指定索引处的字符。索引范围为从 0…...

cmake 入门二 库的编译,安装与使用
工程描述 1,建立一个静态库和动态库,提供HelloFunc 函数供其他程序编程使用,HelloFunc 向终端输出Hello World字符串。 2,安装头文件与共享库。 1 库的工程结构 1.1 工程目录下的CMakeLists.txt PROJECT…...

Python中实现将内容进行base64编码与解码
一、需求说明需要使用Python实现将内容转为base64编码,解码,方便后续的数据操作。二、base64简介Base64是一种二进制到文本的编码方式【是一种基于 64 个可打印字符来表示二进制数据的表示方法(由于 2^664,所以每 6 个比特为一个单…...

集合TreeSet的使用-java
TreeSet的特点:可排序、不重复、无索引。可排序:按照元素的大小默认升序排序;底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。对于数值、字符串类型的(Integer 、Double、String)TreeSet可以排…...

Mybatis-plus 分页集成以及基本使用总结 入门和案例 注解连表查询分页案例等
简介 Mybaits-plus 是mybits 的升级版,从mybaits 升级到mybaits-plus 可以实现平滑升级 Mybaits-plus 本身提供了大量的基本查询方法以及强大的 Wrapper(包装) 类 用于查询的 QueryWrapper 以及 更新的 UpdateWrapper ,使用Wrapper 基本已经可以构建大…...