杰瑞科技汇

Python如何创建SQLite数据库?

下面我将从最基本到更完整的示例,为你详细讲解如何使用 Python 创建和操作 SQLite 数据库。

Python如何创建SQLite数据库?-图1
(图片来源网络,侵删)

核心概念

  • SQLite: 一个轻量级的、基于文件的嵌入式数据库引擎,它不需要一个独立的服务器进程,数据库就是一个单独的文件。
  • sqlite3 模块: Python 内置的模块,提供了与 SQLite 数据库交互的接口。
  • 连接对象: 通过 sqlite3.connect() 创建,代表与数据库文件的连接。
  • 游标对象: 通过 连接对象.cursor() 创建,用于执行 SQL 语句(如 CREATE, INSERT, SELECT 等)。
  • 提交: 对数据库的修改(如插入、更新、删除)需要调用 连接对象.commit() 才能永久保存。
  • 回滚: 如果发生错误,可以调用 连接对象.rollback() 来撤销未提交的更改。

基本步骤:创建数据库和表

这是最核心的流程,包含了创建数据库、创建表、插入数据和查询数据。

import sqlite3
# 1. 连接到数据库 (如果文件不存在,则会自动创建)
# 数据库文件将保存在脚本所在的目录下
conn = sqlite3.connect('example.db')
# 2. 创建一个游标对象
cursor = conn.cursor()
# 3. 创建一个表 (如果表不存在)
# 使用 ? 作为占位符是防止 SQL 注入的最佳实践
create_table_query = """
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    age INTEGER,
    email TEXT UNIQUE
)
"""
cursor.execute(create_table_query)
# 4. 向表中插入数据
# 使用参数化查询来传递数据
insert_query = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)"
user_data = ('Alice', 30, 'alice@example.com')
cursor.execute(insert_query, user_data)
# 插入多条数据
users_to_insert = [
    ('Bob', 24, 'bob@example.com'),
    ('Charlie', 35, 'charlie@example.com')
]
cursor.executemany(insert_query, users_to_insert)
# 5. 提交事务 (非常重要!)
# 这一步会将所有更改写入数据库文件
conn.commit()
print("数据已成功插入。")
# 6. 查询数据
select_query = "SELECT * FROM users"
cursor.execute(select_query)
# 获取所有查询结果
rows = cursor.fetchall()
print("\n当前所有用户:")
for row in rows:
    print(row)
# 7. 关闭连接 (非常重要!)
# 这会释放资源
conn.close()

运行结果:

数据已成功插入。
当前所有用户:
(1, 'Alice', 30, 'alice@example.com')
(2, 'Bob', 24, 'bob@example.com')
(3, 'Charlie', 35, 'charlie@example.com')

使用 with 语句(推荐的最佳实践)

手动管理连接和游标的关闭(conn.close())有时会忘记,尤其是在程序发生异常时,Python 的 with 语句可以确保资源(如连接和游标)在使用完毕后自动关闭,使代码更简洁、更安全。

import sqlite3
# with 语句会在代码块执行完毕后自动关闭连接
with sqlite3.connect('example.db') as conn:
    cursor = conn.cursor()
    # 创建表
    cursor.execute("""
    CREATE TABLE IF NOT EXISTS products (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        price REAL
    )
    """)
    # 插入数据
    cursor.executemany("INSERT INTO products (name, price) VALUES (?, ?)", [
        ('Laptop', 1200.50),
        ('Mouse', 25.99),
        ('Keyboard', 75.00)
    ])
    # 提交事务
    conn.commit()
    print("产品数据已插入。")
    # 查询数据
    cursor.execute("SELECT name, price FROM products WHERE price > 50")
    # 使用 fetchone() 获取单行结果
    print("\n价格超过50元的产品:")
    while True:
        row = cursor.fetchone()
        if row is None:
            break
        print(f"产品: {row[0]}, 价格: {row[1]}")
# 连接在这里已经自动关闭
print("\n连接已关闭。")

运行结果:

Python如何创建SQLite数据库?-图2
(图片来源网络,侵删)
产品数据已插入。
价格超过50元的产品:
产品: Laptop, 价格: 1200.5
产品: Keyboard, 价格: 75.0
连接已关闭。

完整示例:封装成函数

对于更复杂的应用,将数据库操作封装成函数是一个很好的做法。

import sqlite3
import os
DB_FILE = 'company.db'
def get_db_connection():
    """获取数据库连接"""
    return sqlite3.connect(DB_FILE)
def initialize_db():
    """初始化数据库,创建 employees 表"""
    conn = get_db_connection()
    cursor = conn.cursor()
    cursor.execute("""
    CREATE TABLE IF NOT EXISTS employees (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        department TEXT,
        position TEXT
    )
    """)
    conn.commit()
    conn.close()
    print("数据库初始化完成。")
def add_employee(name, department, position):
    """添加一名员工"""
    conn = get_db_connection()
    cursor = conn.cursor()
    try:
        cursor.execute(
            "INSERT INTO employees (name, department, position) VALUES (?, ?, ?)",
            (name, department, position)
        )
        conn.commit()
        print(f"成功添加员工: {name}")
    except sqlite3.Error as e:
        print(f"数据库错误: {e}")
        conn.rollback() # 发生错误时回滚
    finally:
        conn.close()
def get_all_employees():
    """获取所有员工信息"""
    conn = get_db_connection()
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM employees")
    employees = cursor.fetchall()
    conn.close()
    return employees
# --- 主程序 ---
if __name__ == "__main__":
    # 如果数据库文件已存在,先删除它以便于演示
    if os.path.exists(DB_FILE):
        os.remove(DB_FILE)
    initialize_db()
    add_employee("张三", "技术部", "软件工程师")
    add_employee("李四", "市场部", "市场经理")
    add_employee("王五", "技术部", "前端开发")
    print("\n--- 所有员工列表 ---")
    all_employees = get_all_employees()
    for emp in all_employees:
        print(f"ID: {emp[0]}, 姓名: {emp[1]}, 部门: {emp[2]}, 职位: {emp[3]}")

运行结果:

数据库初始化完成。
成功添加员工: 张三
成功添加员工: 李四
成功添加员工: 王五
--- 所有员工列表 ---
ID: 1, 姓名: 张三, 部门: 技术部, 职位: 软件工程师
ID: 2, 姓名: 李四, 部门: 市场部, 职位: 市场经理
ID: 3, 姓名: 王五, 部门: 技术部, 职位: 前端开发

常见问题与最佳实践

  1. SQL 注入

    • 问题: 如果直接将用户输入拼接到 SQL 语句中,可能会导致恶意代码被执行。

    • 坏例子: cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")

    • 好例子: 始终使用参数化查询,用 (或 name 形式的命名参数) 作为占位符。

      # ? 占位符
      cursor.execute("SELECT * FROM users WHERE name = ?", (user_input,))
      # :name 命名占位符
      cursor.execute("SELECT * FROM users WHERE name = :name", {'name': user_input})
  2. 忘记 commit()

    • 问题: 执行了 INSERT, UPDATE, DELETE 但没有调用 conn.commit(),数据实际上只存在于内存中,程序关闭后会丢失。
    • 解决: 养成习惯,在修改数据后立即调用 conn.commit(),使用 with 语句时,commit() 会在块末尾自动执行。
  3. 忘记关闭连接

    • 问题: 数据库连接是有限的资源,不关闭会导致连接泄露,最终可能使程序无法连接到数据库。
    • 解决: 使用 with 语句可以最优雅地解决这个问题,如果不使用 with,请务必在 finally 块中关闭连接。
  4. 处理错误

    • 问题: 数据库操作可能会因为各种原因失败(如约束冲突、磁盘空间不足等)。
    • 解决: 使用 try...except...finally 结构来捕获 sqlite3.Error 异常,并进行适当的处理(如打印错误信息、回滚事务)。

希望这份详细的指南能帮助你掌握在 Python 中使用 SQLite!

分享:
扫描分享到社交APP
上一篇
下一篇