Python编程基础14:数据库编程
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python编程基础14:数据库编程相关的知识,希望对你有一定的参考价值。
文章目录
数据库通常用于存储和处理程序中的大量数据,数据库中的数据按照一定的模型进行组织和存储。常用的一些数据库,如Microsoft SQL Server、Microsoft Access、Microsoft
FoxPro、Oracle、mysql、SQLite等,都属于关系数据库。关系数据库中的数据按照关系模型进行存储。Python3.8内置的sqlite3提供了SQLite数据库访问功能。借助于其他的扩展模块,Python也可访问Microsoft SQL Server、Oracle、MySQL或其他的各种数据库。
一、关系数据库
- 实体间的关系有三种:一对一(one-to-one)、一对多(one-to-many)、多对多(many-to-many)
(一)数据模型
1、层次模型(一对多)
- 层次模型采用树状结构表示数据之间的联系,树的节点称为记录,记录之间只有简单的层次关系。有且只有一个节点没有父节点,该节点称为根节点;其他节点有且只有一个父节点。
2、网状模型(多对多)
- 可以有任意多个节点没有父节点。一个节点允许有多个父节点。两个节点之间可以有两种或两种以上联系。
3、关系模型(一对一)
- 关系模型用二维表格表示数据及数据联系,是应用最为广泛的数据模型。目前,各种常用的数据库,如Microsoft SQL Server、Microsoft Access、Microsoft FoxPro、Oracle、MySQL、SQLite等,都属于关系模型数据库管理系统。
4、面向对象模型
- 面向对象模型是在面向对象技术基础上发展起来一种的数据模型,它采用面向对象的方法来设计数据库。面向对象模型的数据库种存储对象以对象为单位,每个对象包含对象的属性和方法,具有类和继承等特点。
(二)关系数据库的概念和特点
1、基本概念
(1)关系
数据和数据之间的联系称为关系。
(2)二维表
关系数据库使用二维表来表示和存储关系,一个关系就是一个二维表。表中的行称为记录,列称为字段。一个数据库可以包含多个表。
(3)记录与字段
表中的一行称为一个记录。表中的列为记录中的数据项,称为字段。字段也称为属性或者列。每个记录可以包含多个字段,不同记录包含相同的字段(字段的值不同)。例如,用户表中的每个记录包含用户名、登录密码等字段。
关系数据库不允许在一个表中出现重复的记录。
(4)关键字
可以唯一标识一个记录的字段或字段组合称为关键字。一个表可有多个关键字,其中用于标识记录的关键字称为主关键字,其他的关键字可称为候选关键字。一个表只允许有一个主关键字。例如,用户表中的用户名可定义为主关键字,在添加记录时,主关键字不允许重复。
(5)外部关键字
如果一个表中的字段或字段组合作为其他表的主关键字,这样的字段或字段组合称为外部关键字。
2、关系数据库的基本特点
- 关系数据库中的表是二维表,表中的字段必须是不可再分的,即不允许表中表。
- 在同一个表中不允许出现重复的记录。
- 在同一个记录中不允许出现重复的字段。
- 表中记录先后顺序不影响数据的性质,可以交换记录顺序。
- 记录中字段的顺序不影响数据,可以交换字段的顺序。
(三)关系数据库语言SQL
SQL是Structured Query Language的缩写,即结构化查询语言,它是关系数据库的标准语言。Microsoft SQL Server、Microsoft Access、Microsoft FoxPro、Oracle、MySQL、SQLite等各种关系数据库均支持标准的SQL语言,但各种关系数据库具体在实现SQL时可能有所差别。
1、创建和删除数据库
(1)创建数据库:使用create database语句
create database testdb
testdb为创建的数据库名称。
(2)删除数据库:使用drop database语句
drop database testdb
2、创建表
(1)创建表语句
-
在数据库中创建表使用
create table
语句,其基本格式为:create table 数据库名.表名(字段名1 字段数据类型(长度) sql约束,…..)
-
在指定了“数据库名”时,创建的新表属于指定数据库,否则新表属于当前数据库。
(2)常用字段数据类型
数据类型 | 说明 |
---|---|
integer(size) int(size) smallint(size) tinyint(size) | 保存整数,size指定数字的最大位数 |
decimal(size, d) numeric(size, d) | 保存小数,size指定数字的最大位数,d指定小数的最大位数 |
char(size) | 保存固定长度的字符串(字母、数字以及特殊字符),size指定字符串的长度 |
varchar(size) | 保存可变长度的字符串(字母、数字以及特殊字符),size指定字符串的长度 |
date | 保存日期 |
- 最简单的create table命令只指明表名、字段名和数据类型。例如:
create table users(name varchar(10), birth date)
(3)sql约束
- 用于为表或字段定义约束条件,常用的约束有:NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK、DEFAULT(不区分大小写,习惯在SQL语句中将SQL的关键字用大写)。可同时使用为字段定义多个约束。
3、修改表
- 修改表使用
alter table
语句,前面已在修改或删除约束时使用到了该语句。修改表的其他操作通常包括修改表名称、添加字段、修改字段名、修改字段数据类型和删除字段等。
4、删除表
- 删除表使用drop table语句:
drop table users
5、删除表中全部记录
- 删除表中全部记录使用truncate table语句:
truncate table users
6、创建表索引
- 表索引可以按索引字段对记录进行排序,查询索引字段比非索引字段的速度更快。
- create index语句用于创建索引。
create index index_on_name on users(name)
7、创建视图
- 视图是数据库中预定义的查询,创建视图使用create view语句。
create view user_age as select name, age from users
8、执行查询
- select语句用于执行查询,查询结果存储在一个表中(称为查询结果集)。
SELECT 输出字段列表
FROM 表名称
[GROUP BY 用于分组的字段列表]
[WHERE 筛选条件表达式]
[ORDER BY 排序字段列表 [DESC|ASC]]
功能 | 实现 |
---|---|
返回表中的全部字段 | 用星号可表示返回表中的全部字段。select * from users |
返回表中的指定字段 | 在需要返回个别字段时,在输出字段列表中包含这些字段,用逗号分隔。select name, age from users |
为字段指定输出名称 | 默认情况下,查询结果集中字段名与输出字段同名,可以用as为输出字段命名。select name as “用户名”, age as “年龄” from users |
返回唯一值 | 使用关键词DISTINCT可去掉返回记录中的重复值。select DISTINC Tname from users |
使用where子句 | where子句用于指定筛选条件,满足条件的记录才会出现在查询结果集中。select * from users where age<20 |
运算符或函数 | ==, >, <, >=, <=, != between…and… in (…) like, not like isnull() not, and, or sum(), avg(), max(), min(), count() |
对查询结果排序 | order by子句用于指定排序字段,查询结果默认按升序(ASC)排序,使用DESC表示降序。 例如:select * from users oder by age select * from users oder by age DESC 可以使用多个排序字段,并分别指明排序方式。 例如,下面的语句按name升序,age降序对查询结果排序: select * from users oder by name ASC, age DESC |
二、利用SQLite3管理SQLite数据库
(一)下载sqlite3
- 下载网址: http://www.sqlite.org/download.html
- 解压缩
在Pecompiled Binaries for Windows下载 sqlite-tools-win32-x86-3370000.zip
(1.84 MiB),解压缩之后将sqlite3.ext放到某个目录下即可,比如d:\\sqlite3。
(二)利用sqlite3创建并操作数据库
- 在命令行启动sqlite3,创建student.db数据库
- 查看所有数据库
- 创建stu表(概括来讲,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型,分别代表空值、整型值、浮点值、字符串文本、二进制对象。)
- 查看表结构
- 插入四条记录
sqlite> insert into stu (id, name, gender, age) values (1, '余星舟', '男', 19);
sqlite> insert into stu (id, name, gender, age) values (2, '李云美', '女', 18);
sqlite> insert into stu (id, name, gender, age) values (3, '张运恒', '男', 20);
sqlite> insert into stu (id, name, gender, age) values (4, '郑小翠', '女', 18);
- 查看stu全部表记录
- 查询stu所有男生记录
- 查询19岁的男生
- 查询19岁的男生,只显示姓名与年龄
- 按照年龄升序排列
- 按照年龄降序排列
- 先按性别降序排列,再按年龄升序排列
- 统计个数、最大年龄、最小年龄、总年龄、平均年龄
- 按性别分类统计个数、最大年龄、最小年龄、总年龄、平均年龄
select gender, count(*) as 人数, max(age) as 最大年龄, min(age) as 最小年龄, sum(age) as 总年龄, avg(age) as 平均年龄 from stu group by gender;
- 将郑小翠的年龄改成19岁
- 将第一条记录姓名改为“李晓文”,性别改为“女”,年龄改为“19”
- 删除id为3的记录
- 查询所有姓“李”的记录(模糊查询采用
like
运算符,有两个通配符:%
和_
,其中%
代表任意多个任意字符,_
代表一个任意字符)
- 修改id=1的记录,姓名改为“李晓”
- 查询所有姓“李”的单名记录
- 查询所有姓“李”的双名记录
- 插入一条“王晓云”记录
- 查询姓名包含了“云”的记录
三、使用Navicat来管理数据库
(一)下载Navicat12
下载链接:https://pan.baidu.com/s/1P78R9rwnqopTzfjTq8lP4w 提取码:aihp
(二)安装Navicat12
- 按照向导完成安装,启动Navicat12
(三)创建SQLite连接
- 选择创建SQLite…连接
- 设置连接名,设置现有sqlite3数据库
- 单击【确定】按钮
- 打开连接,查看数据库及表
(三)查看stu表内容
1、直接打开表查看表内容
- 选中表,单击右键,在快捷菜单中选择“打开表”
2、通过“查询”显示表内容
- 操作步骤录屏
- 查询操作的结果
(四)修改stu表内容
1、直接打开表修改表内容
- 直接修改id=1的记录
2、通过“查询”修改表内容
- 通过查询修改id=3的记录
- 查看修改后的表内容
(五)分类汇总stu表
- 按性别分类统计个数、最大年龄、最小年龄、总年龄、平均年龄
(六)多表关联查询
1、创建score表
CREATE TABLE score (id INTEGER, name TINYTEXT, chinese INTEGER, math INTEGER, english INTEGER, sum INTEGER);
- 给score表插入4条记录
INSERT INTO score (id, name, chinese, math, english) VALUES (1, '余星舟', 78, 84, 91);
INSERT INTO score (id, name, chinese, math, english) VALUES (2, '李云美', 80, 74, 65);
INSERT INTO score (id, name, chinese, math, english) VALUES (3, '张振强', 65, 90, 75);
INSERT INTO score (id, name, chinese, math, english) VALUES (4, '郑小翠', 90, 64, 88);
- 查看score表内容
- 利用update命令填充sum字段
- 查看score表记录
2、实现stu表与score表的关联查询(一对一的关联)
- 任务:查询每个学生的成绩情况,显示学号、姓名、性别、年龄、语文、数学、英语和总分
(1)利用where子句来实现关联查询
- FROM stu, score —— stu是主表,score是子表
- 都是按照FROM子句的第一张表的id顺序显示的
- 要按照score表的id顺序来显示(FROM score, stu —— score是主表,stu是子表)
(2)利用join关键字来实现关联查询
- 有四种连接方式:inner join, left outer join, right outer join, full outer join
- stu 关联 score 进行查询
- score 关联 stu 进行查询
四、Python访问SQLite数据库
SQLite是Python自带的唯一的关系数据库包,其他的关系数据库则需要通过第三方扩展来访问。Python的API规范定义了底层Python脚本和数据库的访问SQL接口,各种关系数据库在实现Python的SQL接口可能不会遵循Python规范,但与差异很小。
(一)了的解Python的SQL接口
1、连接对象 - Connection
连接对象用于创建数据库连接,所有的数据库操作均通过连接对象与数据库完成交互。连接对象生成游标对象。
2、游标对象 - Cursor
游标对象用于执行各种SQL语句:create table、update、insert、delete、select等。通常连接对象也可执行各种SQL语句。一般返回select语句都使用游标对象来执行,查询结果保存在游标对象中。
3、SQL查询结果
从游标对象中提取的查询结果时,单个记录表示为元组,多个记录则用包含元组的列表表示。在Python脚本中,进一步使用元组或列表操作来处理从数据库返回的查询结果。
(二)连接和创建SQLite数据库
1、创建数据库
- 访问SQLite数据库时,需要先导入sqlite3模块,然后调用connect()方法建立数据库连接。
2、创建内存数据库
- 如果使用“:memory:”表示文件名,Python会创建一个内存数据库。内存数据库中的所有数据均保存在内存中,关闭连接对象时,所有数据自动删除。
3、创建临时数据库
- 如果使用空字符串作为文件名,Python会创建一个临时数据库。临时数据库有一个临时文件,所有数据保存在临时文件中。连接对象关闭时,临时文件和数据也会自动删除。
4、关闭数据库连接
- 执行完所有操作后,应执行close()方法关闭连接对象,释放占用的资源。
(三)创建表
通过连接对象或游标对象的execute()
方法执行create table
语句创建表。
1、通过连接对象创建表
conn.execute('create table user(name text, gender text, age integer)')
- 删除刚才创建的user表
2、通过游标对象创建表
cursor = conn.cursor()
cursor.execute('create table user(name text, gender text, age integer)')
(四)添加记录
-
通过连接对象或游标对象的execute()方法执行insert into语句插入记录
-
添加记录后,可使用游标对象的rowcount属性查看影响的记录行数
-
SQLite允许在insert into语句中使用问号表示参数,在execute()方法中用元组提供参数数据
-
使用参数时,可以使用
executemany()
方法一次添加多条记录,记录数据用元组列表表示
-
执行记录相关的修改操作(添加、删除或更新)时,应执行连接对象的commit()方法提交修改。如果没有执行commit()方法,关闭连接对象后,所有修改都会失效。
-
连接对象的另一个方法rollback()可用于撤销最后一次调用commit()方法后所做的修改。
(五)查询记录
1、使用游标对象的fetchall()方法提取全部查询结果
-
执行select语句可返回数据库中的数据。使用连接对象执行select语句时,返回包含查询结果的游标对象。游标对象的
fetchall()
方法提取全部查询结果。提取出的查询结果中,每条记录为一个元组,所有记录的元组组成一个列表。
-
使用连接对象的execute()方法执行SQL语句
2、使用游标对象来执行select语句
- 说明:调用游标对象的fetchall()方法之后,记录指针指向文件尾
- 能否将记录指针移向第一条记录?
3、使用循环来迭代fetchall()方法取回的数据
4、使用fetchone()方法提取一条记录
- fetchone()方法可以每次提取一条记录,返回的记录为一个元组。在达到表位时,返回None。
- 换一种方式来遍历全部记录
5、使用游标对象的fetchmany(n)方法提取记录
- fetchmany(n)方法可以每次提取n条记录。不指定参数时,返回一条记录。
6、获取字段名列表
(六)使用Row对象
Row对象可存储数据表中每行记录的字段名和数据。要在查询结果中返回Row对象,需要将连接对象的row_factory属性设置为“sqlite3.Row”,设置后,在游标对象的fetchX方法返回的数据中,每个记录为一个Row对象。可将Row对象转换为列表、元组、字典等序列对象。可对Row对象使用位置或字段名索引字段的值。Row对象的keys()方法可返回字段名列表。
1、设置在查询结果生成Row对象
2、将一个Row对象转换成列表、元组、字典
(1)将Row对象转换成列表
(2)将Row对象转换成元组
(3)将Row对象转换成字典
- 将一个Row对象转换成字典
- 获取数据表的字段列表
- 按索引或者字段名获取行对象的值
- 遍历整个记录集
(七)更新记录
1、更新单个字段值
- 任务:将李晓红的年龄改为30
2、更新多个字段值
- 任务:将张玉玲那条记录改成:童安格 男 25
(八)删除记录
1、条件删除记录
- 任务:删除全部男生记录
2、删除全部记录
- 任务:删除全部记录
(九)删除表与数据库
1、删除表
2、删除数据库
- 利用连接对象删除数据库不成功
- 利用游标对象删除数据库
五、下载并安装MySQL
(一)下载MySQL
- 链接:https://pan.baidu.com/s/1BcmDyMCkk-8_zzvOFtoy3Q 提取码:qgb2
(二)安装MySQL
- 双击安装程序图标,进入安装向导,按提示进行操作即可。注意,端口号是3306。
- 完成安装之后,看开始菜单
- 启动MySQL 5.7命令行客户端,输入密码,然后出现MySQL的命令行提示符 - mysql>.data
- 查看数据库
六、使用MySQL操作数据库与表
(一)在Navicat里创建MySQL连接
- 单击【连接】右边的下拉箭头,弹出快捷菜单,选择【MySQL…】
- 输入连接名、主机名以及密码,然后单击【连接测试】
- 双击【mysql】打开连接
(二)创建数据库 - student
- 选中【mysql】连接,单击右键,弹出快捷菜单,选择【新建数据库…】
- 查看新建的数据库 - student,目前是关闭状态
- 双击【student】,打开数据库
(三)创建表
1、创建stu表
- 执行SQL语句创建stu表
CREATE TABLE stu (
id INT PRIMARY KEY NOT NULL,
name VARCHAR(10),
gender VARCHAR(2),
age INT
);
- 查看stu表结构
- 插入表记录
INSERT INTO stu VALUES (1, '余星舟', '男', 19);
INSERT INTO stu VALUES (2, '李云美', '女', 18);
INSERT INTO stu VALUES (3, '张振强', '男', 20);
INSERT INTO stu VALUES (4, '郑小翠', '女', 19);
- 查看表记录
2、创建score表
- 执行SQL语句创建score表
CREATE TABLE score (
以上是关于Python编程基础14:数据库编程的主要内容,如果未能解决你的问题,请参考以下文章