SQLite数据库的介绍与使用

一. 简介

在进⾏数据存储和管理时,我们常常需要⼀个轻量级而又功能强⼤的数据库系统。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模块,开箱即用

核心操作

  1. 连接管理 :通过connect()建立连接,操作后需显式关闭

  2. 数据操作:使用游标执行SQL语句,支持参数化查询防注入

  3. 事务控制 :需手动commit()提交更改,确保数据持久化

SQLAlchemy ORM框架

  • 目的:实现对象关系映射,用Python操作数据库

  • 核心组件

    • 声明式模型:Python类定义表结构

    • 会话管理:统一事务处理机制

    • 查询API:链式调用构建复杂查询

  • 优势:代码面向对象化、支持自动类型转换、简化复杂操作

相关推荐
2401_838472512 小时前
用Python和Twilio构建短信通知系统
jvm·数据库·python
石头wang2 小时前
oracle jdbc 依赖以及对dbeaver的性能影响,如何选择oracle驱动, oracle jdbc 驱动
数据库·oracle
weixin_452159552 小时前
如何从Python初学者进阶为专家?
jvm·数据库·python
Hello.Reader2 小时前
面向 403 与域名频繁变更的合规爬虫工程实践以 Libvio 系站点为例
爬虫·python·网络爬虫
深蓝海拓2 小时前
PySide6从0开始学习的笔记(二十五) Qt窗口对象的生命周期和及时销毁
笔记·python·qt·学习·pyqt
Dfreedom.2 小时前
开运算与闭运算:图像形态学中的“清道夫”与“修复匠”
图像处理·python·opencv·开运算·闭运算
2301_790300962 小时前
用Python读取和处理NASA公开API数据
jvm·数据库·python
葱明撅腚2 小时前
利用Python挖掘城市数据
python·算法·gis·聚类
万象.2 小时前
redis持久化:AOF和RDB
数据库·redis·缓存