【python 内置模块】sqlite3

2024-01-20 00:00:00

目录:

SQLite 是一个轻量级、基于文件的关系型数据库,所有数据存储在一个文件中,具有跨平台、无需独立服务等优点。

sqlite3 模块是一个用于操作 SQLite 数据库的标准库,无需额外安装,适合嵌入式应用和小型项目的数据管理。

连接数据库

使用 sqlite3.connect() 方法可以连接到一个数据库文件。如果文件不存在,则会自动创建。

也可以连接内存数据库,程序退出后数据消失,但是速度会很快。

import sqlite3

# 连接到磁盘上的数据库(持久化)
conn = sqlite3.connect('example.db')

# 或者连接到内存数据库(临时使用,程序退出后数据消失)
# conn = sqlite3.connect(':memory:')

创建游标

游标(Cursor)对象用于执行 SQL 语句并获取结果。

import sqlite3

conn = sqlite3.connect('example.db')

# 获取游标
cursor = conn.cursor()

创建表

通过游标的 execute() 方法执行 SQL 语句来创建表。建议使用 IF NOT EXISTS 避免重复创建。

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER
    )
''')
conn.commit()  # 提交事务,使创建生效

插入数据

插入数据时,强烈建议使用参数化查询(占位符 ?),以防止 SQL 注入攻击。

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 插入单条数据
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30))

# 批量插入数据
users = [('Bob', 25), ('Charlie', 35)]
cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", users)

conn.commit()  # 提交事务

查询数据

查询数据可以使用 fetchall()、fetchone() 或 fetchmany() 方法获取结果。

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 查询所有记录
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
    print(row)  # 每行是一个元组,如 (1, 'Alice', 30)

# 条件查询
cursor.execute("SELECT * FROM users WHERE age > ?", (28,))
results = cursor.fetchall()
for row in results:
    print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}")

# 查询单条记录
cursor.execute("SELECT * FROM users WHERE id = ?", (1,))
user = cursor.fetchone()
print(user)  # 输出 (1, 'Alice', 30)

通过设置 row_factory,可以让查询结果以字典形式返回,更便于访问。

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

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

conn.row_factory = dict_factory
cursor.execute("SELECT * FROM users WHERE id = 1")
print(cursor.fetchone())  # 输出:{'id': 1, 'name': 'Alice', 'age': 30}

更新数据

使用 UPDATE 语句修改现有记录。

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

cursor.execute("UPDATE users SET age = ? WHERE name = ?", (31, 'Alice'))
conn.commit()

删除数据

使用 DELETE 语句删除记录。

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

cursor.execute("DELETE FROM users WHERE id = ?", (2,))
conn.commit()

事务与错误处理

事务确保一组操作要么全部成功,要么全部失败。可以使用 try-except 块进行错误处理,并在出错时回滚。

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

try:
    cursor.execute("INSERT INTO users (name, age) VALUES ('David', 28)")
    cursor.execute("INSERT INTO users (name, age) VALUES ('Eve', 22)")
    conn.commit()  # 成功则提交
except sqlite3.Error as e:
    print(f"操作失败: {e}")
    conn.rollback()  # 失败则回滚,撤销所有操作

关闭连接

操作完成后,应关闭游标和数据库连接以释放资源。

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 操作数据库...

cursor.close()
conn.close()

with 语句自动管理连接

通过 with 语句可以自动管理连接,确保操作完成后自动提交或关闭。

with sqlite3.connect('example.db') as conn:
    cursor = conn.cursor()
    cursor.execute("INSERT INTO users (name, age) VALUES ('Frank', 40)")
    # 无需显式调用 commit(),退出 with 块时自动提交

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: