python 操作 sqlite 数据库(建表, 增删改查)

本文介绍了一个使用Python和SQLite进行数据库操作的例子,包括创建表、插入数据、查询数据、删除数据和更新数据等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import sqlite3


def create(conn):
    """
    创建相应的数据表
    """
    sql_create = '''
    CREATE TABLE `users` (
      `id`  INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
      `username`  TEXT NOT NULL UNIQUE,
      `password`  TEXT NOT NULL,
      `email` TEXT
    )
    '''
    # 用 execute 执行一条 sql 语句
    conn.execute(sql_create)
    print('创建成功')


def insert(conn, username, password, email):
    """
    插入一行的数据
    """
    sql_insert = '''
    INSERT INTO
      users(username, password, email)
    VALUES
      (?, ?, ?);
    '''
    # 下面写法会被 SQL 注入
    # sql = '''
    # INSERT INTO
    #   users(username, password, email)
    # VALUES
    #   ("{}", "{}", "{}")
    # '''.format('123', '345', 'a.com')
    # conn.execute(sql)
    # 参数拼接要用 ?, execute 中的参数传递必须是一个 tuple 类型
    conn.execute(sql_insert, (username, password, email))
    print('插入数据成功')


def select(conn, usr, pwd):
    """
    根据不同的条件查找数据
    当用户名和密码都正确时, 查询数据
    """
    sql = '''
    SELECT
        id, username, email
    FROM
      users
    WHERE
      username=? and password=?
    '''
    cursor = conn.execute(sql, (usr, pwd))
    print('一条数据', list(cursor))

    # 被 SQL 注入的情况
    # usr = 'yin" or "1"="1'
    # pwd = 'gua'
    # sql = '''
    # SELECT
    #     id, username, email
    # FROM
    #     users
    # WHERE
    #     username="{}" and password="{}"
    # '''.format(usr, pwd)
    # cursor = conn.execute(sql)
    # print('一条数据', list(cursor))


def delete(conn, user_id):
    """
    根据 id 删除对应的那条数据
    """
    sql_delte = '''
    DELETE FROM
      users
    WHERE
      id=?
    '''
    # tuple 只有一个元素的时候必须是这种写法
    conn.execute(sql_delte, (user_id,))


def update(conn, user_id, email):
    """
    更新相应部分的数据
    """
    sql_update = '''
    UPDATE
      `users`
    SET
      `email`=?
    WHERE
      `id`=?
    '''
    conn.execute(sql_update, (email, user_id))


def main():
    # 指定数据库名字并打开, 无此数据库, 自动创建
    db_path = 'web.sqlite'
    conn = sqlite3.connect(db_path)
    print("打开了数据库")

    # create(conn)
    # insert(conn, 'sql_', '123', 'a@qq.com')
    # delete(conn, 1)
    update(conn, 3, '119@qq.com')
    select(conn, 'asdads', 'asd')

    # 必须用 commit 函数提交你的修改
    # 否则你的修改不会被写入数据库
    conn.commit()
    conn.close()

if __name__ == '__main__':
    main()


以上程序中所用到的知识点如下:


  • sqlitebrowser

# sqlite 的数据库管理软件 sqlitebrowser

# 下载地址: 点此下载


  • 连接数据库

用法: conn = sqlite3.connect(db_path)

# db_path 即为数据库文件路径

# 若无此数据库, 会自动创建


  • 执行 sql 语句

用法: conn.execute(sql)

# 括号里即为需执行的 sql 语句


  • 参数传递的两种方法

用到 ?, execute 的参数拼接

# 参数拼接要用 ?, execute 中的参数传递必须是一个 tuple 类型

用到 {}, format 的参数拼接

# 用 string.format 拼 sql, 是一个严重的安全漏洞, 会被 SQL 注入


  • 错误提示 database is locked

# SQLite 只支持库级锁

# 库级锁意味着同时只能允许一个写操作

# 出现此问题, 应将多余的写操作进程关闭


  • 被 SQL 注入的情况

# 见上程序 select 函数注释部分


  • 提交数据库修改

用法: conn.commit()

# 必须用 commit 函数提交你的修改, 否则修改不会被写入数据库


  • 数据库连接的关闭

用法: conn.close()

# 数据库使用结束后, 需要关闭数据库


<think>嗯,用户让我帮忙写一个老师信息增删改查,字段包括name、age、info、yesorno。首先,我需要确定用户的技术栈,不过用户没有明确说明,所以可能需要选择一个常用的数据库和编程语言组合。常见的可能是MySQLPython,或者SQLite,这样更轻量级,适合示例。 接下来,字段方面:name应该是字符串类型,age是整数,info可能是较长的文本描述,yesorno看起来像是一个布尔值,用来示是否在职或者其他二选一的状态。数据库设计的话,需要创一张,包含这四个字段,可能还需要一个主键,比如自增的id。 然后,关于增删改查的功能,需要提供基本的CRUD操作。用户可能需要代码示例,所以用PythonSQLite可能更简单,不需要复杂的配置。先写语句,确保字段正确,包括数据类型。比如,name用TEXT,age用INTEGER,info用TEXT,yesorno可以用BOOLEAN或者INTEGER,但SQLite没有布尔类型,通常用0和1示。 接着,每个操作的函数:添加记录需要INSERT语句,删除需要DELETE,更新用UPDATE,查询用SELECT。需要注意参数化查询,防止SQL注入。比如,使用问号作为占位符,而不是字符串拼接。 可能需要考虑用户是否了解数据库连接的基本步骤,所以在代码中应该包含连接数据库、创游标、执行SQL语句和提交更改的步骤。另外,查询功能可能需要返回结果,方便用户查看。 用户可能还希望有一个简单的使用示例,展示如何调用这些函数,比如添加一位老师的信息,然后查询、更新、删除。这样用户可以直接运行代码测试。 另外,字段yesorno的含义可能需要解释,比如1代“是”,0代“否”,这样用户在使用时会更清楚。或者根据具体需求调整,但示例中需要明确说明。 最后,检查代码是否有语法错误,确保每个函数都能正确执行,处理异常情况,比如数据库连接失败,或者查询结果为空的情况。但作为示例,可能不需要太复杂的错误处理,保持简洁。 总结一下,步骤应该是:创数据库,编写增删改查的函数,提供使用示例,并解释每个字段的作用。这样用户就能有一个完整可用的示例,并根据实际需求进行修改。</think>以下是一个基于PythonSQLite的教师信息增删改查示例: ```python import sqlite3 # 创数据库 def create_table(): conn = sqlite3.connect(&#39;teachers.db&#39;) c = conn.cursor() c.execute(&#39;&#39;&#39;CREATE TABLE IF NOT EXISTS teachers (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, info TEXT, yesorno BOOLEAN)&#39;&#39;&#39;) # yesorno字段议用1/0示是/否 conn.commit() conn.close() # 增 def add_teacher(name, age, info, yesorno): conn = sqlite3.connect(&#39;teachers.db&#39;) c = conn.cursor() c.execute("INSERT INTO teachers (name, age, info, yesorno) VALUES (?, ?, ?, ?)", (name, age, info, yesorno)) conn.commit() conn.close() # 删 def delete_teacher(teacher_id): conn = sqlite3.connect(&#39;teachers.db&#39;) c = conn.cursor() c.execute("DELETE FROM teachers WHERE id=?", (teacher_id,)) conn.commit() conn.close() # 改 def update_teacher(teacher_id, name=None, age=None, info=None, yesorno=None): conn = sqlite3.connect(&#39;teachers.db&#39;) c = conn.cursor() updates = [] params = [] if name: updates.append("name=?") params.append(name) if age: updates.append("age=?") params.append(age) if info: updates.append("info=?") params.append(info) if yesorno is not None: updates.append("yesorno=?") params.append(yesorno) params.append(teacher_id) c.execute(f"UPDATE teachers SET {&#39;,&#39;.join(updates)} WHERE id=?", params) conn.commit() conn.close() # 查 def get_teachers(search=None): conn = sqlite3.connect(&#39;teachers.db&#39;) c = conn.cursor() if search: c.execute("SELECT * FROM teachers WHERE name LIKE ?", (f&#39;%{search}%&#39;,)) else: c.execute("SELECT * FROM teachers") results = c.fetchall() conn.close() return results # 使用示例 if __name__ == "__main__": create_table() # 添加教师 add_teacher("张三", 35, "数学教研室主任", 1) add_teacher("李四", 28, "新进英语教师", 1) # 查询所有 print("所有教师:") for teacher in get_teachers(): print(teacher) # 修改信息 update_teacher(1, age=36, yesorno=0) # 条件查询 print("\n搜索&#39;张&#39;:") for teacher in get_teachers("张"): print(teacher) # 删除 delete_teacher(2) ``` 字段说明: - `id`: 自增主键(自动生成) - `name`: 教师姓名(必填) - `age`: 年龄(数字) - `info`: 详细信息/备注 - `yesorno`: 布尔值字段(1示是/有效,0示否/无效) 特点说明: 1. 使用SQLite数据库,无需安装额外服务 2. 参数化查询防止SQL注入 3. 支持部分字段更新 4. 支持模糊查询 5. 数据库文件自动生成在当前目录(teachers.db) 议扩展方向: 1. 添加输入验证(如年龄范围限制) 2. 增加异常处理 3. 添加分页查询功能 4. 连接更专业的数据库(如MySQL) 5. 添加教师编号、职称等更多字段 6. 开发可视化界面(可用PyQt/Tkinter等)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值