当前位置:首页 > 软件 > 正文内容

Python SQLite 数据库使用指南

一往无前2个月前 (08-24)软件350

Python SQLite 详解

SQLite 是一个轻量级的嵌入式数据库,Python 通过 sqlite3 模块提供了对 SQLite 数据库的支持。以下是详细的使用指南。

目录

  1. 基本概念
  2. 连接数据库
  3. 创建表
  4. 插入数据
  5. 查询数据
  6. 更新和删除数据
  7. 事务处理
  8. 使用上下文管理器
  9. 错误处理
  10. 高级功能
  11. 最佳实践

基本概念

SQLite 的特点:

  • 无需单独的服务器进程
  • 数据库存储在单个磁盘文件中
  • 零配置
  • 支持大多数 SQL 标准

连接数据库

import sqlite3

# 连接到数据库(如果不存在则创建)
conn = sqlite3.connect('example.db')

# 创建游标对象
cursor = conn.cursor()

# 关闭连接
conn.close()

使用上下文管理器自动关闭连接:

with sqlite3.connect('example.db') as conn:
    cursor = conn.cursor()
    # 执行操作

创建表

import sqlite3

with sqlite3.connect('example.db') as conn:
    cursor = conn.cursor()
    
    # 创建用户表
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT UNIQUE NOT NULL,
        age INTEGER,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
    ''')
    
    # 创建订单表(外键示例)
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS orders (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        user_id INTEGER,
        product TEXT NOT NULL,
        price REAL NOT NULL,
        FOREIGN KEY (user_id) REFERENCES users (id)
    )
    ''')
    
    conn.commit()

插入数据

单条插入

with sqlite3.connect('example.db') as conn:
    cursor = conn.cursor()
    
    # 插入单条数据
    cursor.execute('''
    INSERT INTO users (name, email, age)
    VALUES (?, ?, ?)
    ''', ('张三', 'zhangsan@email.com', 25))
    
    # 获取最后插入的ID
    last_id = cursor.lastrowid
    print(f"最后插入的ID: {last_id}")
    
    conn.commit()

批量插入

with sqlite3.connect('example.db') as conn:
    cursor = conn.cursor()
    
    users = [
        ('李四', 'lisi@email.com', 30),
        ('王五', 'wangwu@email.com', 28),
        ('赵六', 'zhaoliu@email.com', 35)
    ]
    
    cursor.executemany('''
    INSERT INTO users (name, email, age)
    VALUES (?, ?, ?)
    ''', users)
    
    conn.commit()

查询数据

基本查询

with sqlite3.connect('example.db') as conn:
    cursor = conn.cursor()
    
    # 查询所有数据
    cursor.execute('SELECT * FROM users')
    rows = cursor.fetchall()
    
    for row in rows:
        print(row)
    
    # 查询单条数据
    cursor.execute('SELECT * FROM users WHERE id = ?', (1,))
    user = cursor.fetchone()
    print(f"用户1: {user}")
    
    # 查询特定字段
    cursor.execute('SELECT name, email FROM users WHERE age > ?', (25,))
    users = cursor.fetchall()
    for user in users:
        print(f"姓名: {user[0]}, 邮箱: {user[1]}")

使用字典格式返回结果

def dict_factory(cursor, row):
    d = {}
    for idx, col in enumerate(cursor.description):
        d[col[0]] = row[idx]
    return d

with sqlite3.connect('example.db') as conn:
    conn.row_factory = dict_factory
    cursor = conn.cursor()
    
    cursor.execute('SELECT * FROM users')
    users = cursor.fetchall()
    
    for user in users:
        print(f"ID: {user['id']}, 姓名: {user['name']}, 邮箱: {user['email']}")

更新和删除数据

更新数据

with sqlite3.connect('example.db') as conn:
    cursor = conn.cursor()
    
    # 更新数据
    cursor.execute('''
    UPDATE users 
    SET age = ?, email = ?
    WHERE id = ?
    ''', (26, 'new_email@example.com', 1))
    
    # 检查受影响的行数
    print(f"更新了 {cursor.rowcount} 行")
    
    conn.commit()

删除数据

with sqlite3.connect('example.db') as conn:
    cursor = conn.cursor()
    
    # 删除数据
    cursor.execute('DELETE FROM users WHERE id = ?', (3,))
    
    print(f"删除了 {cursor.rowcount} 行")
    
    conn.commit()

事务处理

with sqlite3.connect('example.db') as conn:
    try:
        cursor = conn.cursor()
        
        # 开始事务(SQLite 默认自动提交关闭)
        cursor.execute('BEGIN TRANSACTION')
        
        # 执行多个操作
        cursor.execute('INSERT INTO users (name, email, age) VALUES (?, ?, ?)', 
                      ('测试用户', 'test@email.com', 40))
        
        cursor.execute('UPDATE users SET age = ? WHERE name = ?', (41, '测试用户'))
        
        # 提交事务
        conn.commit()
        print("事务提交成功")
        
    except sqlite3.Error as e:
        # 回滚事务
        conn.rollback()
        print(f"事务回滚: {e}")

使用上下文管理器

class Database:
    def __init__(self, db_name):
        self.db_name = db_name
    
    def __enter__(self):
        self.conn = sqlite3.connect(self.db_name)
        self.conn.row_factory = sqlite3.Row
        return self.conn.cursor()
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is None:
            self.conn.commit()
        else:
            self.conn.rollback()
        self.conn.close()

# 使用自定义上下文管理器
with Database('example.db') as cursor:
    cursor.execute('SELECT * FROM users')
    for row in cursor:
        print(dict(row))

错误处理

import sqlite3

try:
    with sqlite3.connect('example.db') as conn:
        cursor = conn.cursor()
        
        # 尝试插入重复的email(违反UNIQUE约束)
        cursor.execute('''
        INSERT INTO users (name, email, age)
        VALUES (?, ?, ?)
        ''', ('重复用户', 'zhangsan@email.com', 25))
        
        conn.commit()

except sqlite3.IntegrityError as e:
    print(f"完整性错误: {e}")

except sqlite3.Error as e:
    print(f"数据库错误: {e}")

finally:
    print("操作完成")

高级功能

使用索引提高查询性能

with sqlite3.connect('example.db') as conn:
    cursor = conn.cursor()
    
    # 创建索引
    cursor.execute('CREATE INDEX IF NOT EXISTS idx_users_email ON users (email)')
    cursor.execute('CREATE INDEX IF NOT EXISTS idx_users_age ON users (age)')
    
    conn.commit()

备份数据库

def backup_database(source_db, backup_db):
    with sqlite3.connect(source_db) as source:
        with sqlite3.connect(backup_db) as backup:
            source.backup(backup)

backup_database('example.db', 'example_backup.db')

使用自定义聚合函数

class Average:
    def __init__(self):
        self.count = 0
        self.total = 0
    
    def step(self, value):
        if value is not None:
            self.count += 1
            self.total += value
    
    def finalize(self):
        return self.total / self.count if self.count > 0 else 0

with sqlite3.connect('example.db') as conn:
    conn.create_aggregate("my_avg", 1, Average)
    
    cursor = conn.cursor()
    cursor.execute('SELECT my_avg(age) FROM users')
    result = cursor.fetchone()
    print(f"平均年龄: {result[0]}")

最佳实践

  1. 使用参数化查询防止SQL注入
  2. 始终关闭连接或使用上下文管理器
  3. 合理使用事务提高性能和数据一致性
  4. 创建适当的索引优化查询性能
  5. **使用IF NOT EXISTS**避免重复创建表
  6. 处理异常确保数据库完整性
  7. 定期备份重要数据
# 完整示例
import sqlite3
from contextlib import contextmanager

@contextmanager
def get_db_connection(db_name):
    """数据库连接上下文管理器"""
    conn = sqlite3.connect(db_name)
    conn.row_factory = sqlite3.Row
    try:
        yield conn
    except sqlite3.Error:
        conn.rollback()
        raise
    finally:
        conn.close()

def init_database():
    """初始化数据库"""
    with get_db_connection('example.db') as conn:
        cursor = conn.cursor()
        
        # 创建表
        cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            email TEXT UNIQUE NOT NULL,
            age INTEGER,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )
        ''')
        
        # 创建索引
        cursor.execute('CREATE INDEX IF NOT EXISTS idx_email ON users (email)')
        
        conn.commit()

if __name__ == "__main__":
    init_database()
    
    # 使用示例
    with get_db_connection('example.db') as conn:
        cursor = conn.cursor()
        
        # 插入数据
        cursor.execute(
            'INSERT OR IGNORE INTO users (name, email, age) VALUES (?, ?, ?)',
            ('测试用户', 'test@example.com', 30)
        )
        
        # 查询数据
        cursor.execute('SELECT * FROM users')
        for row in cursor:
            print(dict(row))
        
        conn.commit()

这个详细的指南涵盖了 Python 中使用 SQLite 的主要方面,从基础操作到高级功能,希望能帮助你更好地使用 SQLite 数据库。

“Python SQLite 数据库使用指南” 的相关文章

cURL 命令详解

cURL 命令详解

curl -C - -# -o 是 cURL 命令中多个选项的组合,每个选项的功能如下: ˂a name="1. -C -:断点续传" class="reference-link" href="#"˃1. -C -:断点续传 作用:如果文件下载中断,-C - 会让 cURL 自动检测已下载的部分...

值得推荐的 Windows 版运维面板

值得推荐的 Windows 版运维面板

除了宝塔面板外,还有云帮手、护卫神、UPUPW绿色服务器平台等多款值得推荐的Windows版运维面板,以下是具体介绍: 云帮手:全面兼容所有云服务商,同时兼容Windows、CentOS、Ubuntu等多种云服务器操作系统。它自带远程连接功能,无需额外工具即可进行远程桌面控制,安装和添加服务器...

Python提供HTTP文件服务的几种方式

Python提供HTTP文件服务的几种方式

Python提供HTTP文件服务的几种方式Python有多种方式可以用来提供HTTP文件服务,以下是主要的几种方法: 1. 使用内置模块http.server (Python 3)python -m http.server 8000 # 或指定目录 python -m http.server...

FastAPI 自定义响应模型 + 异常处理器

FastAPI 自定义响应模型 + 异常处理器

在 FastAPI 的最佳实践中,最常用和最推荐的方法是: 🥇 方案1:自定义响应模型 + 异常处理器这是业界标准的做法,原因如下: 完整实现代码from typing import Generic, TypeVar, Any, Optional from pydantic import Ba...

一个简单的短链API程序

一个简单的短链API程序

以下是一个使用 FastAPI 和 SQLite 实现的简单短链 API 程序: 🔗 功能说明: 通过 POST 请求访问 /u?url=原网址,可以创建一个短链(如 /u/abc123)。通过 GET 请求访问 /u/短码(如 /u/abc123),可以跳转到原网址。 📦 项目结构(简单...

在Python Web开发中,Flask和FastAPI都是优秀的选择

在Python Web开发中,Flask和FastAPI都是优秀的选择

在Python Web开发中,Flask和FastAPI都是优秀的选择,但它们的设计理念、适用场景和未来趋势有所不同。以下是详细对比分析和建议: 1. 核心特性对比 特性 Flask FastAPI 诞生时间 2010年(成熟稳定) 2018年(现代框架)...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。