> 技术文档 > python的sqlite3简单用法_python使用sqlite3

python的sqlite3简单用法_python使用sqlite3


1. 连接到数据

在 Python 中使用 sqlite3.connect() 方法连接到 SQLite 数据库。如果数据库文件不存在,会自动创建。


python

import sqlite3# 连接到数据库文件(如果不存在则自动创建)conn = sqlite3.connect(\'example.db\')
  • 解释
    • connect(\'example.db\'):创建或打开名为 example.db 的数据库文件。
    • 返回的 conn 是数据库连接对象,后续操作都需要通过它进行。

2. 创建游标对象

通过连接对象创建游标(Cursor),用于执行 SQL 语句。


python

cursor = conn.cursor()
  • 解释
    • 游标对象 cursor 用于执行 create tableinsert intoselect 等 SQL 语句。

3. 创建表

使用 create table 语句创建表,推荐使用 if not exists 避免重复创建。


python

cursor.execute(\'\'\' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, email TEXT UNIQUE )\'\'\')conn.commit()
  • 解释
    • create table if not exists users:如果表 users 不存在则创建。
    • id integer primary key autoincrementid 是主键,自动递增。
    • name text not nullname 字段为文本类型且不能为空。
    • email text uniqueemail 字段必须唯一。
    • conn.commit():提交事务(必须执行,否则表不会被创建)。

4. 插入数据

使用 insert into 插入数据,推荐使用参数化查询防止 SQL 注入。


python

# 单条插入cursor.execute(\"INSERT INTO users (name, age, email) VALUES (?, ?, ?)\", (\'Alice\', 25, \'alice@example.com\'))# 多条插入users_data = [ (\'Bob\', 30, \'bob@example.com\'), (\'Charlie\', 35, \'charlie@example.com\')]cursor.executemany(\"INSERT INTO users (name, age, email) VALUES (?, ?, ?)\", users_data)conn.commit()
  • 解释
    • values (?, ?, ?)? 是占位符,Python 会自动替换参数(防止 SQL 注入)。
    • executemany 可一次插入多条数据。
    • conn.commit() 提交事务(插入操作必须提交)。

5. 查询数据

使用 select 查询数据,结果通过 fetchone()fetchall() 获取。


python

# 查询所有用户cursor.execute(\"SELECT * FROM users\")rows = cursor.fetchall()for row in rows: print(row)# 条件查询cursor.execute(\"SELECT name, age FROM users WHERE age > ?\", (30,))result = cursor.fetchone()print(result)
  • 解释
    • select * from users:查询 users 表的所有字段。
    • fetchall():获取所有查询结果(返回列表)。
    • fetchone():获取单条结果(返回元组)。
    • where age > ?:筛选 age 大于指定值的记录。

6. 更新数据

使用 update 修改已有数据。


python

cursor.execute(\"UPDATE users SET age = ? WHERE name = ?\", (26, \'Alice\'))conn.commit()
  • 解释
    • set age = ?:将 age 字段更新为新值。
    • where name = ?:仅更新 name 为 \'Alice\' 的记录。
    • conn.commit() 提交事务。

7. 删除数据

使用 delete from 删除数据。


python

cursor.execute(\"DELETE FROM users WHERE name = \'Bob\'\")conn.commit()
  • 解释
    • delete from users:删除 users 表中的记录。
    • where name = \'Bob\':仅删除 name 为 \'Bob\' 的记录。
    • conn.commit() 提交事务。

8. 创建索引(可选)

索引可以加速查询,但会降低插入/更新速度。


python

cursor.execute(\"CREATE INDEX idx_name ON users (name)\")conn.commit()
  • 解释
    • create index idx_name on users (name):为 users 表的 name 字段创建索引。

9. 事务处理

SQLite 支持事务(begin, commit, rollback),确保操作的原子性。


python

try: # 开始事务 conn.execute(\"BEGIN\") # 执行多条操作 cursor.execute(\"INSERT INTO users (name, age) VALUES (?, ?)\", (\'David\', 28)) cursor.execute(\"UPDATE users SET age = ? WHERE name = ?\", (29, \'David\')) # 提交事务 conn.commit()except Exception as e: print(\"事务失败,回滚:\", e) conn.rollback() # 回滚事务
  • 解释
    • begin:显式开始事务(默认情况下,每条语句都是独立事务)。
    • conn.commit():提交事务(所有操作生效)。
    • conn.rollback():回滚事务(撤销所有未提交的操作)。

10. 关闭连接

操作完成后,关闭游标和数据库连接。


python

cursor.close()conn.close()
  • 解释
    • 关闭游标和连接释放资源,避免内存泄漏。

完整示例代码


python

import sqlite3# 1. 连接数据库conn = sqlite3.connect(\'example.db\')cursor = conn.cursor()# 2. 创建表cursor.execute(\'\'\' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, email TEXT UNIQUE )\'\'\')conn.commit()# 3. 插入数据cursor.execute(\"INSERT INTO users (name, age, email) VALUES (?, ?, ?)\", (\'Alice\', 25, \'alice@example.com\'))conn.commit()# 4. 查询数据cursor.execute(\"SELECT * FROM users\")rows = cursor.fetchall()for row in rows: print(row)# 5. 更新数据cursor.execute(\"UPDATE users SET age = ? WHERE name = ?\", (26, \'Alice\'))conn.commit()# 6. 删除数据cursor.execute(\"DELETE FROM users WHERE name = \'Alice\'\")conn.commit()# 7. 关闭连接cursor.close()conn.close()

常见错误与避坑指南

  1. 忘记提交事务

    • 错误:插入/更新/删除后未调用 conn.commit()
    • 修正:每次修改数据后必须调用 conn.commit()
  2. SQL 注入风险

    • 错误:直接拼接 SQL 语句(如 f\"INSERT INTO users VALUES ({name})\")。
    • 修正:使用参数化查询(如 VALUES (?, ?))。
  3. 字段名与保留字冲突

    • 错误:使用 ordergroup 等保留字作为字段名。
    • 修正:避免使用保留字,或用引号包裹字段名(如 \"order\")。
  4. 未关闭连接

    • 错误:程序结束时未关闭 cursor 和 conn
    • 修正:使用 with 上下文管理器自动关闭资源:
      
      

      python

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