Python 课程9-資料庫操作

news2024/9/20 16:51:18

前言

        在现代软件开发中,数据库是核心组件之一,它负责数据的存储、管理和检索。无论是简单的应用程序还是复杂的企业级系统,数据库操作都是必不可少的。本教程将深入讲解如何使用 Python 进行数据库操作,涵盖使用 sqlite3 进行本地数据库操作、MySQL 数据库操作,以及数据库的连接与查询。我们将提供详尽的代码示例,并逐步解析每个细节,确保您能够完全掌握这些技能。最后,我们还将提供完整的应用实例,并展示实际运行的结果,帮助您将所学知识应用于实际项目中。


目录

  1. 数据库操作简介
    • 什么是数据库?
    • 关系型数据库与非关系型数据库
  2. 使用 sqlite3 进行本地数据库操作
    • SQLite 简介
    • 连接到 SQLite 数据库
    • 创建表
    • 插入数据
    • 查询数据
    • 更新和删除数据
    • 应用实例:学生管理系统
  3. MySQL 数据库操作
    • MySQL 简介
    • 安装 MySQL Connector/Python
    • 连接到 MySQL 数据库
    • 创建表
    • 插入数据
    • 查询数据
    • 更新和删除数据
    • 应用实例:员工管理系统
  4. 数据库连接与查询
    • 理解数据库连接
    • 执行 SQL 查询
    • 使用参数化查询防止 SQL 注入
    • 异常处理
  5. 总结

1. 数据库操作简介

1.1 什么是数据库?

数据库是一个以特定方式组织、存储和管理数据的仓库。它允许用户以结构化的方式存储数据,以便高效地检索、插入、更新和删除数据。

1.2 关系型数据库与非关系型数据库

  • 关系型数据库(RDBMS):使用表格来存储数据,表与表之间通过外键建立关系。常见的有 SQLite、MySQL、PostgreSQL 等。
  • 非关系型数据库(NoSQL):以键值对、文档、列族或图等方式存储数据。常见的有 MongoDB、Redis、Cassandra 等。

2. 使用 sqlite3 进行本地数据库操作

2.1 SQLite 简介

        SQLite 是一个自包含的、无需服务器的、零配置的、事务性的 SQL 数据库引擎。它非常适合用于本地、小型项目的数据存储。

2.2 连接到 SQLite 数据库

import sqlite3  # 导入 sqlite3 模块

# 连接到 SQLite 数据库文件,如果文件不存在,会自动创建
conn = sqlite3.connect('students.db')

# 创建游标对象,用于执行 SQL 语句
cursor = conn.cursor()

解释:

  • sqlite3.connect('students.db'):连接到名为 students.db 的数据库文件。
  • cursor = conn.cursor():创建一个游标对象,用于执行数据库操作。

2.3 创建表

# 创建名为 students 的表
cursor.execute('''
    CREATE TABLE IF NOT EXISTS students (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER NOT NULL,
        gender TEXT NOT NULL
    )
''')

# 提交事务
conn.commit()

解释:

  • CREATE TABLE IF NOT EXISTS students:创建一个名为 students 的表,如果表已存在则不创建。
  • 字段说明:
    • id:自增主键。
    • name:学生姓名。
    • age:学生年龄。
    • gender:学生性别。

2.4 插入数据

# 插入单条数据
cursor.execute('INSERT INTO students (name, age, gender) VALUES (?, ?, ?)', ('张三', 20, '男'))

# 插入多条数据
students_data = [
    ('李四', 22, '女'),
    ('王五', 19, '男'),
    ('赵六', 21, '女')
]
cursor.executemany('INSERT INTO students (name, age, gender) VALUES (?, ?, ?)', students_data)

# 提交事务
conn.commit()

解释:

  • 使用 ? 作为参数占位符,防止 SQL 注入攻击。
  • cursor.executemany():一次性插入多条数据。

2.5 查询数据

# 查询所有学生信息
cursor.execute('SELECT * FROM students')

# 获取所有查询结果
students = cursor.fetchall()

# 输出结果
print("学生信息:")
for student in students:
    print(f"ID: {student[0]}, 姓名: {student[1]}, 年龄: {student[2]}, 性别: {student[3]}")

 输出示例:

学生信息:
ID: 1, 姓名: 张三, 年龄: 20, 性别: 男
ID: 2, 姓名: 李四, 年龄: 22, 性别: 女
ID: 3, 姓名: 王五, 年龄: 19, 性别: 男
ID: 4, 姓名: 赵六, 年龄: 21, 性别: 女

解释:

  • cursor.fetchall():获取查询的所有结果。
  • 遍历结果并输出每个学生的信息。

2.6 更新和删除数据

# 更新学生信息,将张三的年龄改为 21 岁
cursor.execute('UPDATE students SET age = ? WHERE name = ?', (21, '张三'))

# 删除姓名为王五的学生
cursor.execute('DELETE FROM students WHERE name = ?', ('王五',))

# 提交事务
conn.commit()

解释:

  • UPDATE 语句用于更新数据。
  • DELETE 语句用于删除数据。

2.7 应用实例:学生管理系统

下面我们将整合以上操作,构建一个简单的学生管理系统。

import sqlite3

def create_connection(db_file):
    """创建数据库连接"""
    conn = sqlite3.connect(db_file)
    return conn

def create_table(conn):
    """创建 students 表"""
    cursor = conn.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS students (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            age INTEGER NOT NULL,
            gender TEXT NOT NULL
        )
    ''')
    conn.commit()

def add_student(conn, name, age, gender):
    """添加学生"""
    cursor = conn.cursor()
    cursor.execute('INSERT INTO students (name, age, gender) VALUES (?, ?, ?)', (name, age, gender))
    conn.commit()

def view_students(conn):
    """查看所有学生"""
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM students')
    students = cursor.fetchall()
    for student in students:
        print(f"ID: {student[0]}, 姓名: {student[1]}, 年龄: {student[2]}, 性别: {student[3]}")

def update_student(conn, student_id, name, age, gender):
    """更新学生信息"""
    cursor = conn.cursor()
    cursor.execute('UPDATE students SET name = ?, age = ?, gender = ? WHERE id = ?', (name, age, gender, student_id))
    conn.commit()

def delete_student(conn, student_id):
    """删除学生"""
    cursor = conn.cursor()
    cursor.execute('DELETE FROM students WHERE id = ?', (student_id,))
    conn.commit()

def main():
    conn = create_connection('students.db')
    create_table(conn)

    while True:
        print("\n=== 学生管理系统 ===")
        print("1. 添加学生")
        print("2. 查看所有学生")
        print("3. 更新学生信息")
        print("4. 删除学生")
        print("5. 退出")
        choice = input("请输入选项(1-5):")

        if choice == '1':
            name = input("姓名:")
            age = int(input("年龄:"))
            gender = input("性别:")
            add_student(conn, name, age, gender)
            print("学生添加成功!")
        elif choice == '2':
            view_students(conn)
        elif choice == '3':
            student_id = int(input("请输入要更新的学生ID:"))
            name = input("新的姓名:")
            age = int(input("新的年龄:"))
            gender = input("新的性别:")
            update_student(conn, student_id, name, age, gender)
            print("学生信息更新成功!")
        elif choice == '4':
            student_id = int(input("请输入要删除的学生ID:"))
            delete_student(conn, student_id)
            print("学生删除成功!")
        elif choice == '5':
            conn.close()
            print("已退出系统。")
            break
        else:
            print("无效的选项,请重新输入。")

if __name__ == '__main__':
    main()

解释:

  • 这是一个简单的控制台程序,提供添加、查看、更新和删除学生的功能。
  • 使用 input() 获取用户输入。
  • 程序运行时,会根据用户的选择执行相应的操作。

3. MySQL 数据库操作

3.1 MySQL 简介

        MySQL 是一个开源的关系型数据库管理系统,具有高性能、高可靠性和易用性,广泛应用于各种应用程序中。

3.2 安装 MySQL Connector/Python

要使用 Python 连接 MySQL 数据库,需要安装 mysql-connector-python 模块。

pip install mysql-connector-python

3.3 连接到 MySQL 数据库

import mysql.connector  # 导入 mysql.connector 模块

# 建立数据库连接
conn = mysql.connector.connect(
    host='localhost',        # 主机地址
    user='root',             # 用户名
    password='your_password',# 密码
    database='company_db'    # 数据库名称
)

# 创建游标对象
cursor = conn.cursor()

解释:

  • 请将 'your_password' 替换为实际的 MySQL 密码。
  • 'company_db' 是要连接的数据库,如果不存在,需要先在 MySQL 中创建。

3.4 创建表

# 创建名为 employees 的表
cursor.execute('''
    CREATE TABLE IF NOT EXISTS employees (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        position VARCHAR(255) NOT NULL,
        salary DECIMAL(10, 2) NOT NULL
    )
''')

# 提交事务
conn.commit()

解释:

  • DECIMAL(10, 2):定义一个精度为 10 位、保留 2 位小数的数值,适用于存储货币等精确数值。

3.5 插入数据

# 插入单条数据
cursor.execute('INSERT INTO employees (name, position, salary) VALUES (%s, %s, %s)', ('Alice', '经理', 12000.00))

# 插入多条数据
employees_data = [
    ('Bob', '工程师', 8000.00),
    ('Charlie', '销售', 7000.00),
    ('Diana', '人事', 6000.00)
]
cursor.executemany('INSERT INTO employees (name, position, salary) VALUES (%s, %s, %s)', employees_data)

# 提交事务
conn.commit()

解释:

  • 使用 %s 作为参数占位符,MySQL Connector 会自动处理数据类型和转义。

3.6 查询数据

# 查询所有员工信息
cursor.execute('SELECT * FROM employees')

# 获取所有查询结果
employees = cursor.fetchall()

# 输出结果
print("员工信息:")
for emp in employees:
    print(f"ID: {emp[0]}, 姓名: {emp[1]}, 职位: {emp[2]}, 薪资: {emp[3]}")

 输出示例:

员工信息:
ID: 1, 姓名: Alice, 职位: 经理, 薪资: 12000.00
ID: 2, 姓名: Bob, 职位: 工程师, 薪资: 8000.00
ID: 3, 姓名: Charlie, 职位: 销售, 薪资: 7000.00
ID: 4, 姓名: Diana, 职位: 人事, 薪资: 6000.00

解释:

  • cursor.fetchall():获取查询的所有结果。
  • 遍历结果并输出每个员工的信息。

3.7 更新和删除数据

# 更新员工薪资
cursor.execute('UPDATE employees SET salary = %s WHERE name = %s', (13000.00, 'Alice'))

# 删除员工
cursor.execute('DELETE FROM employees WHERE name = %s', ('Diana',))

# 提交事务
conn.commit()

解释:

  • UPDATE 语句用于更新数据。
  • DELETE 语句用于删除数据。

3.8 应用实例:员工管理系统

下面我们将构建一个简单的员工管理系统。

import mysql.connector

def create_connection():
    """创建数据库连接"""
    conn = mysql.connector.connect(
        host='localhost',
        user='root',
        password='your_password',
        database='company_db'
    )
    return conn

def create_table(conn):
    """创建 employees 表"""
    cursor = conn.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS employees (
            id INT AUTO_INCREMENT PRIMARY KEY,
            name VARCHAR(255) NOT NULL,
            position VARCHAR(255) NOT NULL,
            salary DECIMAL(10, 2) NOT NULL
        )
    ''')
    conn.commit()

def add_employee(conn, name, position, salary):
    """添加员工"""
    cursor = conn.cursor()
    cursor.execute('INSERT INTO employees (name, position, salary) VALUES (%s, %s, %s)', (name, position, salary))
    conn.commit()

def view_employees(conn):
    """查看所有员工"""
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM employees')
    employees = cursor.fetchall()
    for emp in employees:
        print(f"ID: {emp[0]}, 姓名: {emp[1]}, 职位: {emp[2]}, 薪资: {emp[3]}")

def update_employee(conn, emp_id, name, position, salary):
    """更新员工信息"""
    cursor = conn.cursor()
    cursor.execute('UPDATE employees SET name = %s, position = %s, salary = %s WHERE id = %s', (name, position, salary, emp_id))
    conn.commit()

def delete_employee(conn, emp_id):
    """删除员工"""
    cursor = conn.cursor()
    cursor.execute('DELETE FROM employees WHERE id = %s', (emp_id,))
    conn.commit()

def main():
    conn = create_connection()
    create_table(conn)

    while True:
        print("\n=== 员工管理系统 ===")
        print("1. 添加员工")
        print("2. 查看所有员工")
        print("3. 更新员工信息")
        print("4. 删除员工")
        print("5. 退出")
        choice = input("请输入选项(1-5):")

        if choice == '1':
            name = input("姓名:")
            position = input("职位:")
            salary = float(input("薪资:"))
            add_employee(conn, name, position, salary)
            print("员工添加成功!")
        elif choice == '2':
            view_employees(conn)
        elif choice == '3':
            emp_id = int(input("请输入要更新的员工ID:"))
            name = input("新的姓名:")
            position = input("新的职位:")
            salary = float(input("新的薪资:"))
            update_employee(conn, emp_id, name, position, salary)
            print("员工信息更新成功!")
        elif choice == '4':
            emp_id = int(input("请输入要删除的员工ID:"))
            delete_employee(conn, emp_id)
            print("员工删除成功!")
        elif choice == '5':
            conn.close()
            print("已退出系统。")
            break
        else:
            print("无效的选项,请重新输入。")

if __name__ == '__main__':
    main()

 运行结果示例:

=== 员工管理系统 ===
1. 添加员工
2. 查看所有员工
3. 更新员工信息
4. 删除员工
5. 退出
请输入选项(1-5):1
姓名:Emily
职位:设计师
薪资:9000
员工添加成功!

=== 员工管理系统 ===
1. 添加员工
2. 查看所有员工
3. 更新员工信息
4. 删除员工
5. 退出
请输入选项(1-5):2
ID: 1, 姓名: Alice, 职位: 经理, 薪资: 13000.00
ID: 2, 姓名: Bob, 职位: 工程师, 薪资: 8000.00
ID: 3, 姓名: Charlie, 职位: 销售, 薪资: 7000.00
ID: 5, 姓名: Emily, 职位: 设计师, 薪资: 9000.00

=== 员工管理系统 ===
1. 添加员工
2. 查看所有员工
3. 更新员工信息
4. 删除员工
5. 退出
请输入选项(1-5):5
已退出系统。

解释:

  • 该程序提供添加、查看、更新和删除员工的功能。
  • 使用 mysql.connector 连接 MySQL 数据库。
  • 运行前确保数据库连接配置正确,并已创建对应的数据库。

4. 数据库连接与查询

4.1 理解数据库连接

数据库连接是应用程序与数据库之间的通信通道。建立连接后,应用程序可以执行 SQL 语句,查询或修改数据。

关闭连接:

  • 操作完成后,必须关闭游标和连接,释放资源。
# 关闭游标
cursor.close()

# 关闭连接
conn.close()

4.2 执行 SQL 查询

执行 SQL 查询的一般步骤:

  1. 创建连接和游标
  2. 编写 SQL 语句
  3. 执行 SQL 语句
  4. 提交事务(针对数据修改操作)
  5. 获取结果(针对查询操作)
  6. 关闭游标和连接

4.3 使用参数化查询防止 SQL 注入

使用参数化查询可以防止 SQL 注入,确保数据安全。

# 用户输入
user_input = input("请输入用户名:")

# 安全的参数化查询
cursor.execute('SELECT * FROM users WHERE username = %s', (user_input,))

解释:

  • 避免将用户输入直接拼接到 SQL 语句中。
  • 使用参数占位符,数据库驱动程序会自动处理转义。

4.4 异常处理

在数据库操作中,可能会发生各种异常,需要捕获并处理。

try:
    # 执行数据库操作
    cursor.execute('SELECT * FROM non_existing_table')
except mysql.connector.Error as err:
    print(f"发生错误:{err}")
finally:
    # 确保关闭连接
    cursor.close()
    conn.close()

5. 总结

        数据库是应用程序开发中不可或缺的一部分。通过深入学习数据库操作,您可以构建功能更丰富、性能更优越的应用程序。本教程提供了详尽的代码示例和解释,希望能够帮助您夯实基础,提升技能。在未来的学习和工作中,您可以进一步探索更高级的数据库技术,如事务处理、索引优化、视图和存储过程等,不断提升自己的专业水平。

通过本教程,您学会了:

  • 使用 sqlite3 模块进行本地 SQLite 数据库的操作,包括连接数据库、创建表、插入、查询、更新和删除数据。
  • 使用 mysql.connector 模块连接和操作 MySQL 数据库,掌握了如何配置连接、执行 SQL 语句以及处理查询结果。
  • 构建了完整的应用实例,包括学生管理系统和员工管理系统,了解了如何将数据库操作应用于实际项目。
  • 理解了数据库连接的原理,学会了如何安全地执行 SQL 查询,以及如何处理异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2136001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Autosar学习----AUTOSAR_SWS_BSWGeneral(四)

General Implementation Specification 7.1 General Implementation Specification7.1.1 遵循 MISRA C 和 C 标准7.1.2 遵循 AUTOSAR 基本软件需求7.1.3 遵循 AUTOSAR 方法论7.1.4 平台独立性和编译器抽象7.1.5 可配置性7.1.6 各种命名约定7.1.7 配置参数7.1.8 共享代码7.1.9 全…

论文写作难?用这套ChatGPT提示词3小时完成论文初稿!

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 还在因为写论文头秃吗?你不是一个人!从选题到文献综述,再到最后的结论,每一步都让人抓狂。选题纠结、文献多到看不过来、结构怎么写都不满意——这些是不是让你…

AI 加持的云端 IDE——三种方法高效开发前后端聊天交互功能

以下是「豆包 MarsCode 体验官」优秀文章,作者努力的小雨。 豆包 MarsCode 豆包MarsCode 编程助手支持的 IDE: 支持 Visual Studio Code 1.67.0 及以上版本,以及 JetBrains 系列 IDE,如 IntelliJ IDEA、Pycharm 等,版本要求为 22…

C++八股文基础知识点

1.指针和引用的区别 指针是一个指向内存地址的变量,其本身是一个地址,地址保存的是变量的值,而且它本身可变,包括它指向的地址和地址上的存放的数据;引用即为一个变量的地址,也是变量的别名,和…

opeGauss 之BitmapOr算子代码走读

一. 前言 在openGauss中,BitmapOr算子扫描是指谓词条件是索引列的or条件时,将多个or条件的索引谓词先组成一个需要扫描元组的BitmapOr扫描算子,然后再通过BitmapOr算子的tid信息去扫描元组,从而减少or条件带来的随机扫描过多的问题…

《企业实战分享 · SonarQube10.x 详细教程》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

线下活动|落地武汉、长沙高校,10场AI沙龙火爆来袭

人工智能作为引领时代发展的重要力量,正以前所未有的速度改变着我们的世界,而智能体因其开发门槛低、应用场景广泛等优势成为最热门的AI应用方向之一,未来将拥有庞大生态。为此,百度百科校园在开学季的9月联合文心智能体平台在武汉…

清理C盘缓存的垃圾,专业清理C盘缓存垃圾的步骤与策略

在维护计算机系统的过程中,定期清理C盘(通常是系统盘)中的缓存和垃圾文件是一项至关重要的任务。这不仅能有效释放磁盘空间,提升系统性能,还能减少因磁盘空间不足导致的程序运行缓慢或错误。以下是一系列专业且安全的步…

品胜电子携手成都蓉城,共谋“商业+体育”合作新篇章

9月14日,广东品胜电子股份有限公司(以下简称品胜电子)与成都蓉城足球俱乐部(以下简称成都蓉城)正式签约,成为其官方合作伙伴。全国数码3C行业领军企业与中超强队的携手合作,标志着双方将在“商业体育”融合的模式下资源共享相互赋能,提升其品牌影响力。 蓉城足球俱乐部相关人士…

HTB-Included(本地文件包含、TFTP文件上传、LXD容器挂载目录)

前言 各位师傅大家好,我是qmx_07,今天给大家讲解Included靶机 渗透过程 信息搜集 rustscan工具 通常只扫描TCP端口,所以我们要配合nmap进行-sU 执行udp端口扫描 可以观察到 服务器开放了TFTP UDP端口,用来进行文件传输协议…

2024年度10款视频剪辑软件分享

在视频创作日益盛行的今天,一款强大而易于上手的视频剪辑软件成为了每位创作者不可或缺的工具。无论是专业电影制作人、Vlog博主,还是视频编辑爱好者,都能在市场上找到适合自己的那一款。以下是2024年度推荐的10款视频剪辑软件,涵…

推荐一款免费的图片压缩软件,自媒体运营者、摄影爱好者的必备工具

随着社会的发展,咱们生活里的各种新鲜玩意儿越来越多,互联网就像是一个超级大的市场,啥都能干。比如说,咱们现在拍照、看视频、刷朋友圈、逛网店,这些都离不开图片。但是呢,图片这玩意儿,它占地…

self-play RL学习笔记

让AI用随机的路径尝试新的任务,如果效果超预期,那就更新神经网络的权重,使得AI记住多使用这个成功的事件,再开始下一次的尝试。——llya Sutskever 这两天炸裂朋友圈的OpenAI草莓大模型o1和此前代码能力大幅升级的Claude 3.5&…

跨平台Markdown写作软件:小书匠

本文软件由好友 Eduna 推荐; 什么是小书匠 ? 小书匠是一款本地优先,去中心化,分布式,支持选择性同步的全平台覆盖笔记软件,是专注于 markdown 写作的客户端编辑器。它支持多种平台,包括 Windows…

Qt Model/View之代理

概念 与模型-视图-控制器模式不同,模型/视图设计没有包含一个完全独立的组件来管理与用户的交互。通常,视图负责向用户展示模型数据,并负责处理用户输入。为了在获取输入的方式上具有一定的灵活性,交互由委托执行。这些组件提供输…

5 个最佳开源无代码项目管理工具

想象一下,你是一名项目经理,每天早上刚坐到办公桌前,咖啡还在手里,你的手机和电脑屏幕上已经被各种未完成的任务、项目更新和团队消息填满。 你快速浏览着的电子邮件,分配任务的通知不断弹出,而每一个通知…

Shopee虾皮:广告类型选择与效果优化要点

Shopee虾皮作为东南亚增势迅猛的电商平台,是很多跨境卖家出海东南亚的首要选择。这势必带来强烈的竞争,因此,如果卖家想要突出重围,广告投放和优化则格外重要。 一、虾皮的广告类型 1.关键词广告 当买家搜索的关键字与卖家投放的…

进程优先级和环境变量

1.优先级 1.优先级的概念 cpu资源分配的先后顺序,就是指进程的优先级,linux中进程的优先级数字越小,优先级越高; 2.为什么要有优先级 进程访问的资源(cpu)始终是有限的,而系统中进程又是比较多的,所以进…

【Jetson】Jetson Orin NX刷机教程

Jetson Orin NX刷机教程 一、硬件准备二、安装SDK Manager三、在线或离线刷机 一、硬件准备 需要将Jetson Orin NX的GND和FC_REC引脚短接,设备进入刷机模式。然后用Type-C线将其余主机连接,主机的选择可以为ubuntu虚拟机或者ubuntu系统。注意如果选择虚…

Mybatis接受查询结果的情况

Mybatis接受查询结果的情况 1.查询结果为单条数据时 1&#xff09;通过实体类对象接受 这种方式最直观&#xff0c;当查询结果只有一条记录时使用。在 mapper 接口中定义一个方法&#xff0c;并指定返回类型为对应的实体类类型。mapper.xml 文件中的 <select> 标签使用…