SQLite 是一个基于文件的轻量级数据库,它的所有数据都存储在一个单独的 .db 文件中。

(图片来源网络,侵删)
下面我将分步为你讲解如何创建数据库、表,并进行基本的操作。
第一步:导入 sqlite3 模块
在你的 Python 脚本中导入这个模块。
import sqlite3
第二步:连接到数据库
使用 sqlite3.connect() 函数来连接到一个数据库,这个函数会做两件事之一:
- 如果指定的数据库文件不存在,它会自动创建这个文件,并返回一个连接对象。
- 如果数据库文件已存在,它会直接打开该文件并返回连接对象。
# 数据库文件名
db_file = 'my_database.db'
# 连接到数据库,如果不存在则创建
# conn 是一个连接对象
conn = sqlite3.connect(db_file)
print(f"成功连接到数据库 {db_file}")
# 完成操作后,记得关闭连接
conn.close()
运行这段代码后,你会在你的项目目录下看到一个名为 my_database.db 的新文件,这就是你的 SQLite 数据库文件。

(图片来源网络,侵删)
完整示例:创建数据库、表并插入数据
下面是一个更完整的、包含了创建表、插入数据、查询数据和关闭连接的完整流程,这是最常见的使用模式。
import sqlite3
import os
# --- 1. 连接到数据库 ---
# 如果数据库文件不存在,它会被自动创建
db_file = 'company.db'
conn = sqlite3.connect(db_file)
print(f"成功连接到数据库 {db_file}")
# --- 2. 创建一个游标对象 ---
# 游标用于执行 SQL 语句
cursor = conn.cursor()
# --- 3. 创建表 ---
# 使用游标的 execute() 方法来执行 SQL 语句
# 如果表已存在,DROP TABLE 会删除它,在开发阶段很有用。
# 在生产环境中,需要更谨慎地处理。
try:
cursor.execute('''
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
department TEXT,
position TEXT,
salary REAL
)
''')
print("表 'employees' 创建成功")
except sqlite3.OperationalError as e:
print(f"表已存在或发生错误: {e}")
# --- 4. 向表中插入数据 ---
# 使用参数化查询来防止 SQL 注入
employees_data = [
(1, '张三', '技术部', '软件工程师', 12000.00),
(2, '李四', '市场部', '市场经理', 15000.00),
(3, '王五', '技术部', '高级工程师', 18000.00)
]
# executemany() 可以高效地执行多条相同的 INSERT 语句
cursor.executemany("INSERT INTO employees (id, name, department, position, salary) VALUES (?, ?, ?, ?, ?)", employees_data)
print(f"成功插入 {cursor.rowcount} 条数据")
# --- 5. 提交事务 ---
# 在 SQLite 中,修改操作(INSERT, UPDATE, DELETE)需要手动提交
# 否则更改不会被保存到数据库文件中
conn.commit()
print("事务已提交")
# --- 6. 查询数据 ---
print("\n--- 查询所有员工信息 ---")
cursor.execute("SELECT * FROM employees")
# fetchall() 获取所有查询结果
rows = cursor.fetchall()
# 打印表头
print(f"{'ID':<5}{'姓名':<10}{'部门':<10}{'职位':<15}{'薪资':>10}")
print("-" * 50)
# 打印每一行数据
for row in rows:
print(f"{row[0]:<5}{row[1]:<10}{row[2]:<10}{row[3]:<15}{row[4]:>10.2f}")
# --- 7. 更新数据 ---
print("\n--- 将张三的薪资更新为 13000 ---")
cursor.execute("UPDATE employees SET salary = ? WHERE name = ?", (13000, '张三'))
conn.commit()
print("更新成功")
# 查询更新后的结果
cursor.execute("SELECT name, salary FROM employees WHERE name = '张三'")
updated_employee = cursor.fetchone()
print(f"更新后: {updated_employee[0]} 的薪资是 {updated_employee[1]}")
# --- 8. 关闭连接 ---
# 关闭游标和连接是一个好习惯
cursor.close()
conn.close()
print("\n数据库连接已关闭")
代码关键点解释
conn = sqlite3.connect('database.db'): 连接到数据库,conn是连接对象。cursor = conn.cursor(): 创建一个游标对象,所有的 SQL 命令都通过这个游标来执行。cursor.execute(sql_command): 执行一条 SQL 命令。cursor.executemany(sql_command, data_list): 执行一条 SQL 命令多次,data_list是一个包含多组参数的列表,非常适合批量插入数据。conn.commit(): 非常重要! 在执行了INSERT,UPDATE,DELETE等修改数据的操作后,必须调用此方法来提交事务,否则更改不会持久化。cursor.fetchall(): 获取查询结果集中的所有行,返回一个由元组组成的列表。cursor.fetchone(): 获取查询结果集中的下一行,返回一个元组,如果没有更多数据,则返回None。cursor.close()和conn.close(): 完成所有操作后,关闭游标和连接,释放资源。
使用 with 语句(推荐)
为了确保连接总是能被正确关闭(即使发生错误),强烈建议使用 with 语句。sqlite3 的连接对象支持上下文管理器协议。
import sqlite3
db_file = 'my_database_with.db'
# 使用 with 语句,连接会在代码块执行完毕后自动关闭
with sqlite3.connect(db_file) as conn:
cursor = conn.cursor()
# 创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
username TEXT UNIQUE,
email TEXT
)
''')
# 插入数据
try:
cursor.execute("INSERT INTO users (username, email) VALUES (?, ?)", ('charlie', 'charlie@example.com'))
conn.commit() # 修改操作仍然需要手动提交
print("数据插入成功")
except sqlite3.IntegrityError:
print("用户名 'charlie' 已存在,跳过插入")
# 查询数据
cursor.execute("SELECT * FROM users")
users = cursor.fetchall()
for user in users:
print(user)
print("数据库连接已自动关闭")
- 创建数据库:
sqlite3.connect('your_database.db')会自动处理创建。 - 创建表: 使用
cursor.execute("CREATE TABLE ...")。 - 操作数据: 使用
cursor.execute()或cursor.executemany()。 - 保存修改: 别忘了
conn.commit()。 - 安全查询: 始终使用 作为占位符来传递参数,可以有效防止 SQL 注入攻击。
- 关闭资源: 推荐使用
with语句来管理数据库连接,确保其能被正确关闭。

(图片来源网络,侵删)
