一. 简介
在进⾏数据存储和管理时,我们常常需要⼀个轻量级而又功能强⼤的数据库系统。SQLite 是⼀个极受欢 迎的轻量级数据库,它被⼴泛应用于各种大小的项⽬中。Python 自带了对 SQLite 的支持,使得在 Python 中使⽤SQLite 变得非常简单和直观。
SQLite 是⼀个基于 C 语⾔的轻量级 SQL 数据库引擎。它不需要独⽴的服务器进程,数据库完整 地存储在⼀个磁盘⽂件中。Python 标准库中的 sqlite3 模块提供了⼀个与 SQLite 数据库交互的接⼝。
1.1 基本特点
SQLite是一种嵌入式的关系管理数据库
- 轻量级:SQLite非常小巧,⽆需安装即可使用,适合嵌⼊到各种应用中。
- 易于使用:SQLite的语法与标准SQL⾮常接近,对于有SQL基础的开发者来说,⼊⻔⾮常简单。
- 高性能:虽然是轻量级数据库,但SQLite在处理⼩型和中型数据集时性能非常优越。
- 跨平台:SQLite可以运⾏在各种操作系统上,包括Windows、Linux和macOS。
二. SQLite数据库
在Python中操作SQLite数据库需要先安装SQLite的库。SQLite是一个轻量级的嵌入式数据库引擎,不需要单独安装数据库服务器,非常适合小型应用和原型开发。Python标准库中已经内置了sqlite3模块,无需额外下载安装,可以直接使用。
要使用SQLite数据库,我们只需在Python代码中导入sqlite3模块即可:
python
import sqlite3 # 导入
2.1 建立数据库/表
.db作为SQLite数据库文件扩展名- 操作完成后应当显式关闭连接释放资源
- SQLite数据库文件会保存在当前工作目录下
python
import sqlite3
# 连接到SQLite数据库
# 如果数据库不存在,会自动在当前目录创建
connect = sqlite3.connect('my_database.db')
# 创建游标对象用于执行SQL语句
cursor = connect.cursor()
# 执行数据库操作...
# 例如创建表、插入数据等
# 最后记得关闭连接
connect.close()
数据表结构的定义
创建数据表时需要定义表的结构,包括字段名称、数据类型和约束条件。常见的约束包括主键(primary key)、唯一约束(unique)、非空约束(not null)和自动递增(autoincrement)。合理的表结构设计是数据操作的基础。
2.2 操作数据库
- 数据库连接:connection 变量建立了与 SQLite 数据库的连接
- 游标操作:crs 游标用于执行 SQL 命令
- 数据插入:向 student 表中插入一条学生记录,包含姓名、性别、年龄和地址
- 事务提交:connection.commit() 确保数据变更永久保存
- 资源释放:connection.close() 关闭数据库连接,防止资源泄露
插入数据完整示例
python
# 连接到 SQLite 数据库 My_School.db(如果不存在会自动创建)
connection = sqlite3.connect('My_School.db')
# 创建游标对象,用于执行 SQL 语句
crs = connection.cursor()
# 执行插入语句,向 student 表中添加一条学生记录
crs.execute("insert into student(sname,sex,age,address) values ('Alo','男',18,'长沙')")
# 提交事务,将更改保存到数据库
connection.commit()
# 关闭数据库连接,释放资源
connection.close()
增删查改操作语法
参数化查询 ?:占位符
python
# 插入数据
crs.execute("insert into student(sname,sex,age,address) values ('Alo','男',18,'长沙')")
crs.execute("insert into student(sname,sex,age,address) values (?,?,?,?)",("翠花","女",19,"树洞"))
# 更新数据
crs.execute("""
update student set sname = ?,age = ? where sid = ?
""",("猴",19,1))
# 删除数据
crs.execute("""
delete from student where sid=?
""",(4,))
# 查询数据
crs.execute("""
select * from student where age between 19 and 28
""")
data = crs.fetchall() # 获取查询结果, 返回⼀个包含元组的列表
三. SQLAlchemy ORM框架应用
3.1 声明式模型定义
SQLAlchemy的声明式基类允许开发者使用Python类来定义数据库表结构。通过继承declarative_base()创建的基类,可以将Python对象与数据库表进行映射,实现了面向对象的数据库操作方式
python
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, declarative_base
Base = declarative_base()
class Database(Base):
__tablename__ = "books"
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String, unique=True)
author = Column(String)
year = Column(Integer)
3.2 会话管理机制
sessionmaker用于创建数据库会话实例,每个会话代表一次数据库事务。在使用完会话后必须调用close()方法关闭连接,防止连接泄露。通常使用try-finally块或上下文管理器来确保资源的正确释放。
python
# 创建会话工厂
# SessionLocal 是一个工厂函数,用于创建数据库会话实例
# autocommit=False: 禁用自动提交,需要手动调用 commit() 提交事务
# autoflush=False: 禁用自动刷新,需要手动调用 flush() 刷新到数据库
# bind=engine: 绑定到数据库引擎
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
def add_book(books: AddBook):
# 创建数据库会话实例
db = SessionLocal()
try:
# 创建新的数据库记录对象
db_data = Database(
title=books.title, # 设置书籍标题
author=books.author, # 设置书籍作者
year=books.year # 设置出版年份
)
# 将新记录添加到会话中(准备插入数据库)
db.add(db_data)
# 提交事务,将更改保存到数据库
db.commit()
# 返回成功消息
return '添加成功'
finally:
# 确保数据库会话被关闭,释放连接资源
db.close()
3.3 查询API的使用
SQLAlchemy提供了丰富的查询API,支持链式调用的方式构建复杂查询。常用的查询方法包括filter()用于条件过滤、all()获取所有结果、first()获取第一条结果、count()统计记录数等。
python
def find_book_by_title(title: str):
"""
根据书籍标题查询书籍信息
:param title: 书籍标题(字符串类型),作为查询条件
:return: 若查询到匹配数据,返回对应的数据库模型实例;若无匹配数据,返回None
"""
# 创建数据库会话对象,SessionLocal是预定义的数据库会话工厂,用于建立数据库连接
db = SessionLocal()
try:
# 1. db.query(Database):指定查询的数据库模型类Database
# 2. filter(Database.title == title):添加查询条件,匹配标题等于传入的title参数
# 3. first():执行查询并获取结果集中的第一条数据,无结果时返回None
db_result = db.query(Database).filter(Database.title == title).first()
# 返回查询结果(模型实例/None)
return db_result
finally:
# 无论try块中代码是否执行成功,最终都会执行此步骤
# 关闭数据库会话,释放数据库连接资源,避免连接泄露
db.close()
3.3 查询API的使用
SQLAlchemy提供了丰富的查询API,支持链式调用的方式构建复杂查询。常用的查询方法包括filter()用于条件过滤、all()获取所有结果、first()获取第一条结果、count()统计记录数等。
python
def find_book_by_title(title: str):
db = SessionLocal()
try:
# 使用filter进行条件查询,first()获取第一条结果
db_result = db.query(Database).filter(Database.title == title).first()
return db_result
finally:
db.close()
3.4 JSON数据交换
JSON是现代Web API中最常用的数据交换格式。FastAPI自动处理JSON请求体的解析和响应的序列化。客户端使用requests库可以轻松发送JSON格式的请求,通过json参数传递数据。
python
import requests
import json
def add_book(title, author, year):
res = requests.post(
"http://127.0.0.1:8080/add_book",
json={"title": title, "author": author, "year": year}
)
result = json.loads(res.text)
return result['message']
四. 总结
SQLite数据库
- 本质:轻量级嵌入式关系数据库,无服务器架构,数据库存储在单一文件中
- 特点:无需独立安装、跨平台、适合中小型项目
- Python支持 :内置
sqlite3模块,开箱即用
核心操作
-
连接管理 :通过
connect()建立连接,操作后需显式关闭 -
数据操作:使用游标执行SQL语句,支持参数化查询防注入
-
事务控制 :需手动
commit()提交更改,确保数据持久化
SQLAlchemy ORM框架
-
目的:实现对象关系映射,用Python操作数据库
-
核心组件:
-
声明式模型:Python类定义表结构
-
会话管理:统一事务处理机制
-
查询API:链式调用构建复杂查询
-
-
优势:代码面向对象化、支持自动类型转换、简化复杂操作