Python 课程9-資料庫操作

前言

        在现代软件开发中,数据库是核心组件之一,它负责数据的存储、管理和检索。无论是简单的应用程序还是复杂的企业级系统,数据库操作都是必不可少的。本教程将深入讲解如何使用 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 sqlite3def create_connection(db_file):"""创建数据库连接"""conn = sqlite3.connect(db_file)return conndef 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("已退出系统。")breakelse: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.connectordef create_connection():"""创建数据库连接"""conn = mysql.connector.connect(host='localhost',user='root',password='your_password',database='company_db')return conndef 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("已退出系统。")breakelse: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.rhkb.cn/news/423842.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《论网络安全体系设计》写作框架,软考高级系统架构设计师

论文真题 随着社会信息化的普及,计算机网络已经在各行各业得到了广泛的应用。目前,绝大多数业务处理几乎完全依赖计算机和网络执行,各种重要数据如政府文件、工资档案、财务账目和人事档案等均依赖计算机和网络进行存储与传输。另一方面&…

从用户数据到区块链:Facebook如何利用去中心化技术

在数字化时代,用户数据的管理和保护已成为科技公司面临的重大挑战。作为全球最大的社交网络平台之一,Facebook不仅在用户数据的处理上积累了丰富的经验,也在探索如何利用去中心化技术,如区块链,来改进其数据管理和用户…

Kafka原理剖析之「Topic创建」

一、前言 Kafka提供了高性能的读写,而这些读写操作均是操作在Topic上的,Topic的创建就尤为关键,其中涉及分区分配策略、状态流转等,而Topic的新建语句非常简单 bash kafka-topics.sh \ --bootstrap-server localhost:9092 \ // …

【刷题】Day4--密码检查

Hi! 今日刷题,小白一枚,欢迎指导 ~ 【链接】 密码检查_牛客题霸_牛客网 【思路】 依次根据规则判断密码是否合格。while里嵌套个for循环,来进行密码的多组输入,for循环进行一次代表判断一个密码串;规则…

springboot请求传参常用模板

注释很详细,直接上代码 项目结构 源码 HelloController package com.amoorzheyu.controller;import com.amoorzheyu.pojo.User; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.*;import java.ti…

2024桥梁科技两江论坛——第二届桥梁工程安全与韧性学术会议

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网:https://ais.cn/u/vEbMBz提交检索:EI Compendex、IEEE Xplore、Scopus 三、大会介绍 2024年桥梁科技两江论坛——第二届桥梁工程…

一种简单的过某宝验证码的方式(仅做学习使用)

开篇 今天介绍一种简单的过某宝验证码的方式,用的是自动化,这样对不会js逆向的小白非常友好,只需要用到selenium框架就能轻松过某宝验证码,即模拟人的操作对滑块进行滑动。 但是首先还是需要训练验证码和标题 训练前&#xff1a…

基于微信小程序的图书馆预约占座系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的图…

GD - GD32350R_EVAL - PWM实验和验证3 - EmbeddedBuilder - 无源蜂鸣器 - 用PMOS来控制

文章目录 GD - GD32350R_EVAL - PWM实验和验证3 - EmbeddedBuilder - 无源蜂鸣器 - 用PMOS来控制概述笔记失败图成功图蜂鸣器管脚波形总结END GD - GD32350R_EVAL - PWM实验和验证3 - EmbeddedBuilder - 无源蜂鸣器 - 用PMOS来控制 概述 以前做了一个实验,用PMOS来…

智能智造和工业软件研发平台SCSAI功能介绍

用爱编程30年,倾心打造工业和智能智造软件研发平台SCIOT,用创新的方案、大幅的让利和极致的营销,致力于为10000家的中小企业实现数字化转型,打造数字化企业和智能工厂,点击上边蓝色字体,关注“AI智造AI编程”或文末扫码…

element-plus表单使用show-overflow-tooltip,避免占满屏幕,需要设置宽度

在表单中&#xff0c;<el-table-clumn>中添加show-overflow-tooltip&#xff0c;可以实现表格内容过多的问题。 属性官方解释&#xff1a;是否隐藏额外内容并在单元格悬停时使用 Tooltip 显示它们。 出现的问题&#xff1a; 使用了该属性之后&#xff0c;弹出的详细内…

Linux 手动安装Ollama

Linux 离线安装Ollama 前言 不知道为什么 在阿里云服务器上 执行curl -fsSL https://ollama.com/install.sh | sh一键安装 非常慢 所以只能手动装了 1.到 https://ollama.com/install.sh 下载安装执行文件 修改其中 下载和安装部分代码 if curl -I --silent --fail --location…

形态学算法(连通分量提取,区域最大值提取)

文章目录 二值图像形态学算法连通分量提取 灰度图形态学算法灰度重建区域最大值查找 本文先列举一些近期用到的形态学算法&#xff0c;以后可能会再进行补充。 二值图像形态学算法 连通分量提取 在上一篇文章中已经提到连通分量的概念&#xff0c;这里再进行回顾&#xff1a;…

go 笔记

数据结构与 方法&#xff08;增删改查&#xff09; 安装goland,注意版本是2024.1.1&#xff0c;不是2024.2.1&#xff0c;软件下载地址也在链接中提供了 ‘go’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 在 Windows 搜索栏中输入“环境变量”&#…

SurfaceTexture OnFrameAvailableListener 调用流程分析

背景: 最近项目中遇到一个问题, 需要搞清楚OnFrameAvailableListener 回调流程, 本文借此机会做个记录, 巩固印象, 有相关困惑的同学也可以参考下. 本文基于Android 14 framework 源码进行分析 SurfaceTexture.java OnFrameAvailableListener 设置过程 public void setOnFra…

html+css+js网页设计 旅游 龙门石窟4个页面

htmlcssjs网页设计 旅游 龙门石窟4个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…

【CSS】选择器(基本选择器、复合选择器、属性匹配选择器、结构伪类选择器、伪元素选择器)

选择器 引入方式基础选择器复合选择器属性匹配选择器结构伪类选择器伪元素选择器 引入方式 1&#xff1a;外联 <!-- css引入方式1&#xff1a;外联 外联与内嵌优先级相同&#xff0c;取决于加载顺序 --><link rel"stylesheet" href"./样式.css"…

SpringBoot2:请求处理原理分析-利用内容协商功能实现接口的两种数据格式(JSON、XML)

文章目录 一、功能说明二、案例实现1、基于请求头实现2、基于请求参数实现 一、功能说明 我们知道&#xff0c;用ResponseBody注解标注的接口&#xff0c;默认返回给页面的是json数据。 其实&#xff0c;也可以返回xml结构的数据给页面。 这一篇就来实现一下这个小功能。 二、…

TI DSP下载器XDS100 V2.0无法使用问题

前言 TI DSP下载器XDS100 V2.0用着用着会突然报Error&#xff0c;特别是你想要用Code Composer Studio烧录下载程序的时候 查看设备管理器&#xff0c;发现XDS100 V2.0的设备端口莫名其妙消失了 问了淘宝的厂家&#xff0c;他说TI的开发板信号可能会导致调试器通信信号中断&a…

每日OJ_牛客_点击消除(栈)

目录 牛客_点击消除&#xff08;栈&#xff09; 解析代码 牛客_点击消除&#xff08;栈&#xff09; 点击消除_牛客题霸_牛客网 描述&#xff1a; 牛牛拿到了一个字符串。 他每次“点击”&#xff0c;可以把字符串中相邻两个相同字母消除&#xff0c;例如&#xff0c;字符…