🍀 前言
博客地址:
- CSDN:https://blog.csdn.net/powerbiubiu
👋 简介
SQLite3是一种轻量级嵌入式数据库引擎,它在Python中被广泛使用。SQLite3通常已经包含在Python标准库中,无需额外安装。你只需导入 sqlite3 模块即可开始使用,不仅可以实现数据的持久化操作,还能对数据进行增删改查的功能。
📖 正文
1 SQLite3的使用
1.1 连接数据库
如果连接的数据库不存在则创建,
以下代码在python文件同级目录下创建一个test.db
文件
import sqlite3
# 连接到数据库(如果不存在则创建)
connection = sqlite3.connect('test.db')
1.2 创建表
创建一个users表,其中包含id,name,age
# 创建表
cursor.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
# 提交更改
connection.commit()
1.3 插入数据
# 插入数据
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('李四', 18))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('张三', 20))
#
# 提交更改
connection.commit()
print(cursor.rowcount)
print(cursor.lastrowid)
# 1
# 2
Tips:
SQLite3在执行多条数据插入,并且commit提交后,rowcount只会返回最后一次插入影响的行,也就是1,而lastrowid只返回插入的最后一条数据的id。
1.4 查询数据
首先在控制台中通过sqlite3 test.db
连接数据库,在通过select * from users;
可以查询到我们刚才添加的数据
通过代码查询,我们发现,返回的数据和连接数据库查询的一致
通过代码查询返回的是一个列表
# 查询数据
cursor.execute("SELECT * FROM users")
# 获取所有行
rows = cursor.fetchall()
print(rows)
print(type(rows))
# [(1, '李四', 18), (2, '张三', 20)]
# <class 'list'>
如果查询一个数据,返回的结果,仍然是列表保存的元组数据
# 查询数据
cursor.execute("SELECT * FROM users WHERE id = 1")
# 获取所有行
rows = cursor.fetchall()
print(rows)
print(type(rows))
# [(1, '李四', 18)]
# <class 'list'>
1.5 更新数据
将id为1的name改成王五
# 更新数据
cursor.execute("UPDATE users SET name = ? WHERE id = ?", ('王五', 1))
connection.commit()
# 打印受影响的行
print(cursor.rowcount)
# 1
这时,我们在查询一下结果,发现id为1的数据被修改了
# 查询数据
cursor.execute("SELECT * FROM users")
# # 获取所有行
rows = cursor.fetchall()
print(rows)
# [(1, '王五', 18), (2, '张三', 20)]
1.6 删除数据
与更新操作一样,删除成功后会返回受影响的行。
备注:需要注意,第二个参数传入元组时,只有一个元素的情况下,需要加个,
号,表示该参数为元组
cursor.execute("DELETE FROM users WHERE id = ?", (1,))
connection.commit()
print(cursor.rowcount)
# 1
1.7 关闭连接
# 关闭游标和连接
cursor.close()
connection.close()
2 上下文管理器操作SQLite3
with sqlite3.connect('test.db') as connection:
cursor = connection.cursor()
# 执行数据库操作
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
print(rows)
# [(1, '李四', 18), (2, '张三', 20)]
这种方式方便好用,可以不用手动编写关闭游标和连接的代码,与with open()
是使用方式相同。
3 封装工具类
import sqlite3
class SQLite3Tools:
def __init__(self, db_name: str) -> None:
self.db_name = db_name
self.connection = None
self.cursor = None
self.connect()
def __del__(self):
self.disconnect()
def connect(self) -> None:
"""
连接数据库
:return:
"""
# 连接到数据库(如果不存在则创建)
self.connection = sqlite3.connect(self.db_name)
self.cursor = self.connection.cursor()
def disconnect(self):
# 关闭游标和连接
if self.cursor:
self.cursor.close()
if self.connection:
self.connection.close()
def execute_create(self, sql):
"""
创建数据库
:param sql:
:return:
"""
self.cursor.execute(sql)
def execute_query(self, sql: str, parameters: tuple = None) -> list:
"""
查询操作
:param sql: sql语句
:param parameters: 参数
:return: 返回结果
"""
# 执行查询
if parameters:
self.cursor.execute(sql, parameters)
else:
self.cursor.execute(sql)
return self.cursor.fetchall()
def execute_insert(self, sql: str, parameters: tuple = None) -> int:
"""
插入操作
:param sql: sql语句
:param parameters: 参数
:return: 返回结果
"""
if parameters:
self.cursor.execute(sql, parameters)
else:
self.cursor.execute(sql)
self.connection.commit()
# 返回插入的行的ID
return self.cursor.lastrowid
def execute_update(self, sql: str, parameters: tuple = None) -> int:
"""
更新操作
:param sql: sql语句
:param parameters: 参数
:return: 返回结果
"""
if parameters:
self.cursor.execute(sql, parameters)
else:
self.cursor.execute(sql)
self.connection.commit()
# 返回受影响的行
return self.cursor.rowcount
def execute_delete(self, sql: str, parameters: tuple = None) -> int:
"""
删除操作
:param sql: sql语句
:param parameters: 参数
:return: 返回结果
"""
if parameters:
self.cursor.execute(sql, parameters)
else:
self.cursor.execute(sql)
self.connection.commit()
# 返回受影响的行
return self.cursor.rowcount
3.1 创建数据库和表
# 创建工具类实例
db = SQLite3Tools('test.db')
# 第一次使用需要创建一个表
db.execute_create('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
3.2 插入数据
db = SQLite3Tools('test.db')
# 执行插入
user_id = db.execute_insert("INSERT INTO users (name, age) VALUES (?, ?)", ('张三', 18))
print(f"张三的id为: {user_id}")
user_id = db.execute_insert("INSERT INTO users (name, age) VALUES (?, ?)", ('李四', 19))
print(f"李四的id为: {user_id}")
user_id = db.execute_insert("INSERT INTO users (name, age) VALUES (?, ?)", ('王五', 19))
print(f"王五的id为: {user_id}")
# 张三的id为: 1
# 李四的id为: 2
# 王五的id为: 3
3.3 查询数据
db = SQLite3Tools('test.db')
# 执行查询
result = db.execute_query("SELECT * FROM users")
print(result)
# [(1, '张三', 18), (2, '李四', 19), (3, '王五', 19)]
3.4 更新数据
将张三的年龄更新为30岁
db = SQLite3Tools('test.db')
# 执行更新
result = db.execute_update("UPDATE users SET age = ? WHERE name = ?", (30, '张三'))
print(f"受影响的行:{result}")
# 受影响的行:1
3.5 删除数据
删除id为4的数据(不存在的一个数据)
db = SQLite3Tools('test.db')
# 删除一个不存在的数据
result = db.execute_delete("DELETE FROM users WHERE id = ?", (4,))
print(f"受影响的行:{result}")
# 受影响的行:0
删除id为3的数据(该数据存在)
db = SQLite3Tools('test.db')
# 删除一个存在的数据
result = db.execute_delete("DELETE FROM users WHERE id = ?", (3,))
print(f"受影响的行:{result}")
# 受影响的行:1
✏ 总结
SQLite是一种轻量级的、零配置的、自包含的、开源的关系型数据库引擎。它提供了一个简单而方便的方式来存储和管理数据。
使用场景:
- 桌面应用程序:sqlite3可以作为桌面应用程序的本地数据库,用于存储用户设置、缓存数据等;
- 移动应用程序:sqlite3在Android和iOS平台上都有广泛的使用,可以作为移动应用程序的本地数据库,存储离线数据、用户信息等;
- 小型项目:对于一些简单的项目,可以使用sqlite3作为数据库解决方案,避免了复杂的数据库配置和维护工作;
- 学习和测试:sqlite3是一个很好的学习关系型数据库的工具,可以帮助初学者快速了解数据库的基本概念和操作。