sqlite3,一个轻松管理数据的python库

123 阅读3分钟

Python数据库:用sqlite3轻松管理你的数据!

今天分享一个特别实用的技能 —— 使用Python的sqlite3库操作数据库。SQLite就像是一个随身携带的"小型数据仓库",不需要安装复杂的数据库软件,就能轻松管理你的数据!

一、sqlite3基础入门

首先,让我们导入sqlite3库并创建一个简单的数据库:

import sqlite3
from datetime import datetime

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

💡 小贴士:sqlite3是Python标准库的一部分,不需要额外安装。数据库文件就像一个普通文件一样,可以随时复制或移动!

二、数据库操作基础

1. 创建表

def create_tables():
    """创建基本的数据表"""
    # 创建用户表
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            email TEXT UNIQUE,
            created_at TIMESTAMP
        )
    ''')
    
    # 创建订单表
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS orders (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            user_id INTEGER,
            amount REAL,
            order_date TIMESTAMP,
            FOREIGN KEY (user_id) REFERENCES users (id)
        )
    ''')
    
    # 保存更改
    conn.commit()

2. 插入数据

def insert_user(name, email):
    """插入用户数据"""
    try:
        cursor.execute('''
            INSERT INTO users (name, email, created_at)
            VALUES (?, ?, ?)
        ''', (name, email, datetime.now()))
        conn.commit()
        return cursor.lastrowid
    except sqlite3.IntegrityError:
        print(f"错误:邮箱 {email} 已存在")
        return None

def insert_order(user_id, amount):
    """插入订单数据"""
    cursor.execute('''
        INSERT INTO orders (user_id, amount, order_date)
        VALUES (?, ?, ?)
    ''', (user_id, amount, datetime.now()))
    conn.commit()

三、数据查询和更新

1. 基本查询

def query_examples():
    """基本查询示例"""
    # 查询所有用户
    cursor.execute('SELECT * FROM users')
    all_users = cursor.fetchall()
    
    # 查询特定用户
    cursor.execute('SELECT * FROM users WHERE name = ?', ('张三',))
    user = cursor.fetchone()
    
    # 统计订单金额
    cursor.execute('''
        SELECT user_id, SUM(amount) as total_amount 
        FROM orders 
        GROUP BY user_id
    ''')
    order_stats = cursor.fetchall()
    
    return all_users, user, order_stats

2. 高级查询

def advanced_queries():
    """高级查询示例"""
    # 联表查询
    cursor.execute('''
        SELECT users.name, orders.amount, orders.order_date
        FROM users
        JOIN orders ON users.id = orders.user_id
        WHERE orders.amount > ?
        ORDER BY orders.order_date DESC
    ''', (1000,))
    
    # 使用聚合函数
    cursor.execute('''
        SELECT 
            strftime('%Y-%m', order_date) as month,
            COUNT(*) as order_count,
            SUM(amount) as total_amount
        FROM orders
        GROUP BY month
        HAVING total_amount > ?
    ''', (5000,))

四、实用工具类封装

class DatabaseManager:
    def __init__(self, db_file):
        self.db_file = db_file
        self.conn = None
        self.cursor = None
    
    def connect(self):
        """连接数据库"""
        try:
            self.conn = sqlite3.connect(self.db_file)
            self.cursor = self.conn.cursor()
            return True
        except Exception as e:
            print(f"连接数据库失败:{str(e)}")
            return False
    
    def disconnect(self):
        """关闭数据库连接"""
        if self.conn:
            self.conn.close()
    
    def execute(self, sql, parameters=None):
        """执行SQL语句"""
        try:
            if parameters:
                self.cursor.execute(sql, parameters)
            else:
                self.cursor.execute(sql)
            self.conn.commit()
            return True
        except Exception as e:
            print(f"执行SQL失败:{str(e)}")
            return False
    
    def query(self, sql, parameters=None):
        """查询数据"""
        try:
            if parameters:
                self.cursor.execute(sql, parameters)
            else:
                self.cursor.execute(sql)
            return self.cursor.fetchall()
        except Exception as e:
            print(f"查询失败:{str(e)}")
            return []
    
    def backup_database(self, backup_file):
        """备份数据库"""
        try:
            with sqlite3.connect(backup_file) as backup:
                self.conn.backup(backup)
            return True
        except Exception as e:
            print(f"备份失败:{str(e)}")
            return False

五、实战案例:简单的客户管理系统

class CustomerManager:
    def __init__(self):
        self.db = DatabaseManager('customers.db')
        self.db.connect()
        self.initialize_database()
    
    def initialize_database(self):
        """初始化数据库表"""
        self.db.execute('''
            CREATE TABLE IF NOT EXISTS customers (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT NOT NULL,
                phone TEXT UNIQUE,
                email TEXT,
                created_at TIMESTAMP
            )
        ''')
    
    def add_customer(self, name, phone, email=None):
        """添加客户"""
        return self.db.execute('''
            INSERT INTO customers (name, phone, email, created_at)
            VALUES (?, ?, ?, ?)
        ''', (name, phone, email, datetime.now()))
    
    def search_customers(self, keyword):
        """搜索客户"""
        return self.db.query('''
            SELECT * FROM customers
            WHERE name LIKE ? OR phone LIKE ? OR email LIKE ?
        ''', (f"%{keyword}%"f"%{keyword}%"f"%{keyword}%"))
    
    def update_customer(self, customer_id, **kwargs):
        """更新客户信息"""
        fields = ', '.join(f"{k} = ?" for k in kwargs.keys())
        sql = f"UPDATE customers SET {fields} WHERE id = ?"
        return self.db.execute(sql, (*kwargs.values(), customer_id))
    
    def delete_customer(self, customer_id):
        """删除客户"""
        return self.db.execute(
            "DELETE FROM customers WHERE id = ?",
            (customer_id,)
        )

⚠️ 注意事项

  1. 始终使用参数化查询防止SQL注入
  2. 及时关闭数据库连接
  3. 定期备份重要数据
  4. 注意处理并发访问
  5. 合理使用事务确保数据一致性

💡 进阶提示

  • 学习使用ORM框架(如SQLAlchemy)
  • 实现数据库迁移功能
  • 添加数据库性能监控
  • 设计更复杂的数据库结构

测试新人可以学习《测试人的 Python 工具书》书籍《性能测试 JMeter 实战》书籍