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

(二)安装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:数据库编程的主要内容,如果未能解决你的问题,请参考以下文章

[Python] 文科生零基础学编程系列二——数据类型变量常量的基础概念

哪有python编程入门经典教程

少儿Python编程

Python题目

Python基础

Python 编程1000例(14):使用字典实现 switch 结构通讯录