使用SQLite

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

与许多其他数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是一种嵌入式数据库,它的数据库就是一个文件。SQLite将整个数据库,包括定义、表、索引以及数据本身,作为一个单独的、可跨平台使用的文件存储在主机中。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中。Python就内置了SQLite3,所以在Python中使用SQLite,不需要安装任何模块,直接使用。

1 创建数据库文件

由于Python中已经内置了SQLite3,所以可以直接使用import语句导入SQLite3模块。Python操作数据库的通用的流程如图1所示。

图1 操作数据库流程

实例01 创建SQLite数据库文件

创建一个mrsoft.db的数据库文件,然后执行SQL语句创建一个user(用户表),user表包含id和name两个字段。具体代码如下:

import sqlite3

连接到SQLite数据库

数据库文件是mrsoft.db,如果文件不存在,会自动在当前目录创建

conn = sqlite3.connect('mrsoft.db')

创建一个Cursor

cursor = conn.cursor()

执行一条SQL语句,创建user表

cursor.execute('create table user (id int(10) primary key, name varchar(20))')

关闭游标

cursor.close()

关闭Connection

conn.close()

上述代码中,使用sqlite3.connect()方法连接SQLite数据库文件mrsoft.db,由于mrsoft.db文件并不存在,所以会在本实例Python代码同级目录下创建mrsoft.db文件,该文件包含了user表的相关信息。mrsoft.db文件所在目录如图2所示。

图2 mrsoft.db文件所在目录

说明:再次运行实例01时,会提示错误信息:sqlite3.OperationalError:table user alread exists,这是因为user表已经存在。

2 操作SQLite

(1)新增用户数据信息

为了向数据表中新增数据,可以使用如下SQL语句:

insert into 表名(字段名1,字段名2,...,字段名n) values (字段值1,字段值2,...,字段值n)

在user表中,有2个字段,字段名分别为id和name。而字段值需要根据字段的数据类型来赋值,如id是一个长度为10的整型,name是长度为20的字符串型数据。向user表中插入3条用户信息记录,则SQL语句如下:

cursor.execute('insert into user (id, name) values ("1", "MRSOFT")')

cursor.execute('insert into user (id, name) values ("2", "Andy")')

cursor.execute('insert into user (id, name) values ("3", "明日科技小助手")')

下面通过一个实例介绍向SQLite数据库中插入数据的流程。

实例02 新增用户数据信息

由于在实例01中已经创建了user表,所以本实例可以直接操作user表,向user表中插入3条用户信息。此外,由于是新增数据,需要使用commit()方法提交事务。因为对于增加、修改和删除操作,使用commit()方法提交事务后,如果相应操作失败,可以使用rollback()方法回滚到操作之前的状态。新增用户数据信息具体代码如下:

import sqlite3

连接到SQLite数据库

数据库文件是mrsoft.db

如果文件不存在,会自动在当前目录创建

conn = sqlite3.connect('mrsoft.db')

创建一个Cursor

cursor = conn.cursor()

执行一条SQL语句,插入一条记录

cursor.execute('insert into user (id, name) values ("1", "MRSOFT")')

cursor.execute('insert into user (id, name) values ("2", "Andy")')

cursor.execute('insert into user (id, name) values ("3", "明日科技小助手")')

关闭游标

cursor.close()

提交事务

conn.commit()

关闭Connection

conn.close()

运行该实例,会向user表中插入3条记录。为验证程序是否正常运行,可以再次运行,如果提示如下信息,说明插入成功(因为user表中已经保存了上一次插入的记录,所以再次插入会报错)。

sqlite3.IntegrityError: UNIQUE constraint failed: user.id

(2)查看用户数据信息

查找user表中的数据可以使用如下SQL语句:

select 字段名1,字段名2,字段名3,... from 表名 where 查询条件

查看用户信息的代码与插入数据信息大致相同,不同点在于使用的SQL语句不同。此外,查询数据时通常使用如下3种方式:

l fetchone():获取查询结果集中的下一条记录。

l fetchmany(size):获取指定数量的记录。

l fetchall():获取结果集的所有记录。

下面通过一个实例来学习这3种查询方式的区别。

实例03 使用3种方式查询用户数据信息

分别使用fetchone、fetchmany和fetchall这3种方式查询用户信息,具体代码如下:

import sqlite3

连接到SQLite数据库,数据库文件是mrsoft.db

conn = sqlite3.connect('mrsoft.db')

创建一个Cursor

cursor = conn.cursor()

执行查询语句

cursor.execute('select * from user')

获取查询结果

result1 = cursor.fetchone()

print(result1)

关闭游标

cursor.close()

关闭Connection

conn.close()

使用fetchone()方法返回的result1为一个元组,执行结果如下:

(1,'MRSOFT')

(1)修改实例03代码,将获取查询结果的语句块代码修改为:

result2 = cursor.fetchmany(2) # 使用fetchmany方法查询多条数据

print(result2)

使用fetchmany()方法传递一个参数,其值为2,默认为1。返回的result2为一个列表,列表中包含2个元组,运行结果如下:

[(1,'MRSOFT'),(2,'Andy')]

(2)修改实例03代码,将获取查询结果的语句块代码修改为:

result3 = cursor.fetchall() # 使用fetchmany方法查询多条数据

print(result3)

使用fetchall()方法返回的result3为一个列表,列表中包含所有user表中数据组成的元组,运行结果如下:

[(1,'MRSOFT'),(2,'Andy'),(3,'明日科技小助手')]

(3)修改实例03代码,将获取查询结果的语句块代码修改为:

cursor.execute('select * from user where id > ?',(1,))

result3 = cursor.fetchall()

print(result3)

在select查询语句中,使用问号作为占位符代替具体的数值,然后使用一个元组来替换问号(注意,不要忽略元组中最后的逗号)。上述查询语句等价于:

cursor.execute('select * from user where id > 1')

执行结果如下:

[(2,'Andy'),(3,'明日科技小助手')]

说明:使用占位符的方式可以避免SQL注入的风险,推荐使用这种方式。

(3)修改用户数据信息

修改user表中的数据可以使用如下SQL语句:

update 表名 set 字段名 = 字段值 where 查询条件

下面通过一个实例来学习一下如何修改表中数据。

实例04 修改用户数据信息

将SQLite数据库中user表ID为1的数据name字段值"mrsoft"修改为"MR",并使用fetchAll获取表中的所有数据。具体代码如下:

import sqlite3

连接到SQLite数据库,数据库文件是mrsoft.db

conn = sqlite3.connect('mrsoft.db')

创建一个Cursor:

cursor = conn.cursor()

cursor.execute('update user set name = ? where id = ?',('MR',1))

cursor.execute('select * from user')

result = cursor.fetchall()

print(result)

关闭游标

cursor.close()

提交事务

conn.commit()

关闭Connection:

conn.close()

执行结果如下:

[(1, 'MR'), (2, 'Andy'), (3, '明日科技小助手')]

(4)删除用户数据信息

删除user表中的数据可以使用如下SQL语句:

delete from 表名 where 查询条件

下面通过一个实例来学习如何删除表中数据。

实例05 删除用户数据信息

将SQLite数据库中user表ID为1的数据删除,并使用fetchAll获取表中的所有数据,查看删除后的结果。具体代码如下:

import sqlite3

连接到SQLite数据库,数据库文件是mrsoft.db

conn = sqlite3.connect('mrsoft.db')

创建一个Cursor:

cursor = conn.cursor()

cursor.execute('delete from user where id = ?',(1,))

cursor.execute('select * from user')

result = cursor.fetchall()

print(result)

关闭游标

cursor.close()

提交事务

conn.commit()

关闭Connection:

conn.close()

执行上述代码后,user表中ID为1的数据将被删除。运行结果如下:

[(2, 'Andy'), (3, '明日科技小助手')]

相关推荐
六月闻君12 分钟前
MySQL 报错:1137 - Can‘t reopen table
数据库·mysql
hopetomorrow13 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
mengao123414 分钟前
centos 服务器 docker 使用代理
服务器·docker·centos
SelectDB技术团队21 分钟前
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
大数据·数据库·数据仓库·数据分析·doris
不是二师兄的八戒22 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
小牛itbull23 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
C-cat.23 分钟前
Linux|进程程序替换
linux·服务器·microsoft
怀澈12225 分钟前
高性能服务器模型之Reactor(单线程版本)
linux·服务器·网络·c++
学Linux的语莫28 分钟前
Ansible Playbook剧本用法
linux·服务器·云计算·ansible
请叫我欧皇i31 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript