python如何读写sqllite3数据库

大哥大姐们有没有人讲详细点的我想说明下,python如何读写sqllite3数据库
最新回答
情根深种

2026-03-27 20:23:04

Python通过内置的sqlite3模块提供对SQLite数据库的完整支持,无需额外安装即可直接使用。以下是系统化的操作指南:

一、基础操作流程
  1. 连接数据库使用sqlite3.connect()函数创建或连接数据库文件,返回连接对象:

    import sqlite3conn = sqlite3.connect('example.db') # 文件不存在时自动创建
  2. 创建游标对象游标用于执行SQL语句并管理结果集:

    cursor = conn.cursor()
  3. 执行SQL语句通过游标或连接对象直接执行SQL命令:

    # 创建表cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')
  4. 提交事务修改操作需显式提交才能生效:

    conn.commit()
  5. 关闭连接释放资源避免数据损坏:

    conn.close()
二、核心操作详解1. 数据插入
  • 单条插入:

    cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 25)) # 使用参数化查询防SQL注入conn.commit()
  • 批量插入:使用executemany()提高效率:

    users_data = [('Bob', 30), ('Charlie', 35)]cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", users_data)conn.commit()
2. 数据查询
  • 获取所有结果:

    cursor.execute("SELECT * FROM users")rows = cursor.fetchall() # 返回列表,每行是元组for row in rows: print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}")
  • 逐行获取:

    cursor.execute("SELECT * FROM users")for row in cursor: # 直接迭代游标对象 print(row)
  • 获取单条结果:

    cursor.execute("SELECT * FROM users WHERE id=?", (1,))user = cursor.fetchone() # 返回单行元组或None
3. 数据更新cursor.execute("UPDATE users SET age=? WHERE name=?", (26, 'Alice'))conn.commit()print(f"更新行数: {conn.total_changes}") # 返回受影响行数4. 数据删除cursor.execute("DELETE FROM users WHERE id=?", (1,))conn.commit()三、高级功能
  1. 上下文管理器自动处理连接和提交:

    with sqlite3.connect('example.db') as conn: cursor = conn.cursor() cursor.execute("INSERT INTO users VALUES (NULL, 'David', 40)") # 无需显式commit(),退出with块时自动提交
  2. 行工厂设置将查询结果转为字典格式:

    def dict_factory(cursor, row): d = {} for idx, col in enumerate(cursor.description): d[col[0]] = row[idx] return dconn.row_factory = dict_factorycursor = conn.cursor()cursor.execute("SELECT * FROM users")print(cursor.fetchone()) # 输出: {'id': 1, 'name': 'Alice', 'age': 26}
  3. 错误处理捕获数据库操作异常:

    try: cursor.execute("INSERT INTO users VALUES (NULL, NULL, 'text')") # 违反age为INTEGER约束 conn.commit()except sqlite3.Error as e: print(f"数据库错误: {e}") conn.rollback() # 回滚事务
四、性能优化建议
  1. 批量操作时使用事务显式包裹事务可提升性能:

    conn = sqlite3.connect('example.db')try: cursor = conn.cursor() cursor.execute("BEGIN TRANSACTION") for i in range(1000): cursor.execute("INSERT INTO users VALUES (?, ?, ?)", (i, f"Name_{i}", 20 + i%10)) conn.commit()except: conn.rollback() raisefinally: conn.close()
  2. 索引优化为频繁查询的字段创建索引:

    cursor.execute("CREATE INDEX IF NOT EXISTS idx_users_name ON users (name)")
  3. 内存数据库临时测试可使用内存数据库:

    conn = sqlite3.connect(':memory:') # 数据仅存在于内存
五、完整示例代码import sqlite3# 连接数据库(不存在则创建)conn = sqlite3.connect('company.db')cursor = conn.cursor()# 创建表cursor.execute('''CREATE TABLE IF NOT EXISTS employees (id INTEGER PRIMARY KEY, name TEXT NOT NULL, department TEXT, salary REAL)''')# 插入数据employees = [ (1, 'John', 'Engineering', 75000), (2, 'Jane', 'Marketing', 65000), (3, 'Mike', 'Sales', 55000)]cursor.executemany("INSERT INTO employees VALUES (?, ?, ?, ?)", employees)# 查询数据print("所有员工:")cursor.execute("SELECT * FROM employees")for row in cursor.fetchall(): print(row)# 更新数据cursor.execute("UPDATE employees SET salary=? WHERE name=?", (80000, 'John'))print(f"n更新行数: {conn.total_changes}")# 条件查询print("n工程部员工:")cursor.execute("SELECT * FROM employees WHERE department=?", ('Engineering',))print(cursor.fetchone())# 关闭连接conn.commit()conn.close()

通过以上方法,可高效完成SQLite数据库的增删改查操作。如需更复杂的功能(如JSON支持、全文检索),可参考SQLite官方文档扩展使用。