当前位置: 首页 > news >正文

python_内置sqlite3模块详解

SQLite 是 Python 内置的轻量级数据库,无需单独的服务器进程,使用文件存储数据。它适合小型应用、原型开发或嵌入式系统,支持标准 SQL 语法。下面详细介绍sqlite3模块的用法和示例。

1. 连接数据库

使用sqlite3.connect()创建数据库连接。如果数据库不存在,会自动创建。

import sqlite3 # 连接到数据库(如果不存在则创建) conn = sqlite3.connect('example.db') # 或使用内存数据库: sqlite3.connect(':memory:') # 创建游标对象执行 SQL 命令 cursor = conn.cursor()

2. 创建表

使用CREATE TABLE语句创建表,需调用conn.commit()提交事务。

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

3. 插入数据

使用INSERT INTO插入单条或多条记录。

# 插入单条记录 cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", ("Alice", 30, "alice@example.com")) # 插入多条记录(使用 executemany) users_data = [ ("Bob", 25, "bob@example.com"), ("Charlie", 35, "charlie@example.com") ] cursor.executemany("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", users_data) conn.commit() # 提交事务

4. 查询数据

使用SELECT语句查询数据,通过fetchone()fetchall()fetchmany()获取结果。

# 查询所有记录 cursor.execute("SELECT * FROM users") all_users = cursor.fetchall() print("所有用户:", all_users) # 查询单条记录 cursor.execute("SELECT * FROM users WHERE name = ?", ("Alice",)) user = cursor.fetchone() print("Alice:", user) # 使用 fetchmany 获取部分结果 cursor.execute("SELECT * FROM users") some_users = cursor.fetchmany(2) print("前两条记录:", some_users)

5. 更新和删除数据

使用UPDATEDELETE语句修改数据,需提交事务。

# 更新记录 cursor.execute("UPDATE users SET age = ? WHERE name = ?", (31, "Alice")) # 删除记录 cursor.execute("DELETE FROM users WHERE age < ?", (30,)) conn.commit() # 提交事务

6. 参数化查询

使用参数化查询(?占位符)防止 SQL 注入。

# 安全示例:使用参数化查询 name = "Charlie" cursor.execute("SELECT * FROM users WHERE name = ?", (name,)) # 不安全示例(避免这样写) # cursor.execute(f"SELECT * FROM users WHERE name = '{name}'")

7. 事务处理

SQLite 默认使用自动提交模式,可通过conn.commit()conn.rollback()管理事务。

try: # 开始事务 cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", ("David", "david@example.com")) # 模拟错误 # 1 / 0 # 取消注释此行触发异常 conn.commit() # 提交事务 except Exception as e: print(f"Error: {e}") conn.rollback() # 回滚事务

8. 高级特性

8.1 自定义函数
def multiply(a, b): return a * b conn.create_function("multiply", 2, multiply) cursor.execute("SELECT multiply(3, 4)") print(cursor.fetchone()) # 输出: (12,)
8.2 行对象(Row Objects)
conn.row_factory = sqlite3.Row cursor.execute("SELECT * FROM users") row = cursor.fetchone() print(row["name"], row["age"]) # 通过列名访问数据

9. 关闭连接

操作完成后关闭游标和连接。

cursor.close() conn.close()

完整示例:用户管理系统

下面是一个完整的用户管理系统示例,包含增删改查功能:

import sqlite3 def create_connection(): conn = sqlite3.connect('users.db') conn.row_factory = sqlite3.Row return conn def create_table(): conn = create_connection() with conn: conn.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE, age INTEGER ) ''') def add_user(name, email, age): conn = create_connection() with conn: try: conn.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)", (name, email, age)) return True except sqlite3.IntegrityError: print(f"Error: Email {email} already exists.") return False def get_all_users(): conn = create_connection() with conn: return conn.execute("SELECT * FROM users").fetchall() def update_user_age(user_id, new_age): conn = create_connection() with conn: conn.execute("UPDATE users SET age = ? WHERE id = ?", (new_age, user_id)) def delete_user(user_id): conn = create_connection() with conn: conn.execute("DELETE FROM users WHERE id = ?", (user_id,)) # 使用示例 if __name__ == "__main__": create_table() add_user("Eve", "eve@example.com", 28) users = get_all_users() for user in users: print(dict(user)) # 打印为字典格式

注意事项

  1. 线程安全:SQLite 支持多线程读,但写入时需加锁(默认模式)。
  2. 事务管理:批量操作时使用事务可显著提高性能。
  3. 大数据处理:SQLite 适合中小型数据集,大数据量建议使用 PostgreSQL 或 MySQL。

通过上述示例,你可以掌握sqlite3模块的基本用法。如需更复杂的功能,可以结合 Python 的其他库(如 Pandas)进行数据处理。

http://www.cnnetsun.cn/news/101940.html

相关文章:

  • 开发AI Agent的多语言情感分析比较系统
  • 48、Linux DBMS 管理全攻略
  • 49、Linux系统管理实用指南(上)
  • 17、数据库设计:从简单到复杂的实践指南
  • EmotiVoice + GPU加速:实现千小时语音批量生成
  • 欧姆龙 FINS ⇌ 西门子 S7 智能数据交换网关
  • 租打印机哪家好
  • CANN TIK数据搬运GM到UB高性能优化实战
  • (弓乙图)希言自然。飘风不终朝,骤雨不终日。孰为此者?是乃天地。然天地尚不能久,而况于人乎?
  • 在线监测:筑牢风电并网安全与效能的核心防线
  • 2026毕设ssm+vue基于框架的问答平台论文+程序
  • EmotiVoice语音合成服务健康检查机制
  • 告别机械音!EmotiVoice实现自然情感语音合成
  • 电机生产车间设备看板物联网方案
  • TPAMI 2025 | 图像超分新范式:LTPE 以局部纹理分布约束,兼顾视觉质量与参数效率
  • mysql建表后的数据填入
  • Observe · Secure · AI|观测云2025中国可观测日深圳站圆满收官
  • 基于SpringBoot的大学生科技竞赛管理系统(毕业设计项目源码+文档)
  • 基于SpringBoot的动漫分享系统的设计与实现(毕业设计项目源码+文档)
  • 震惊!这3家环保服务商靠谱到让你意想不到!
  • 微服务网格:Istio 流量管理实战
  • 电脑启动太慢怎么解决?从底层优化到专业电脑加速的5大终极策略
  • 我的新能源车企,如何靠六西格玛培训跑赢质量与成本的终极竞赛?
  • [创业之路]-734-没有权力的责任是奴役,没有责任的权力是腐败,没有利益的责任是忽悠。管得好,叫责权利统一;管不好,叫利权责倒挂。一流的组织:用责任牵引权力和利益;末流的组织:用利益和权力逃避责任
  • 基于SpringBoot的自动驾驶数据处理任务众包平台系统毕业设计项目源码
  • 基于SpringBoot的养老院管理系统毕业设计项目源码
  • 若是Windows下的HGDB配置参数work_mem>=2GB会导致HGDB服务无法启动
  • 17、使用psad应对网络攻击:原理、配置与实例
  • EmotiVoice能否替代真人配音?实测对比告诉你
  • EmotiVoice语音紧迫感调控适合警报通知