程序猿大战Python——实现简单的图书馆系统操作
步骤1:安装和导入库
首先,确保已经安装了 pymysql 库。如果没有安装,请执行以下命令:
pip install pymysql
然后,导入必要的库:
import pymysql
步骤2:创建数据库和表的函数
编写一个函数来创建数据库和表,并在表中插入一些数据:
CREATE DATABASE IF NOT EXISTS library;
USE library;
CREATE TABLE IF NOT EXISTS books (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键,自增',title VARCHAR(255) NOT NULL COMMENT '书名',author VARCHAR(255) NOT NULL COMMENT '作者',isbn VARCHAR(13) NOT NULL UNIQUE COMMENT '国际标准书号,唯一'
) COMMENT='图书表';
USE library;
INSERT INTO books (title, author, isbn) VALUES
('红楼梦', '曹雪芹', '9787539999999'),
('西游记', '吴承恩', '9787539988888'),
('水浒传', '施耐庵', '9787539977777'),
('三国演义', '罗贯中', '9787539966666');
步骤3:定义 Book 类
定义一个简单的 Book 类来表示书籍:
class Book(object):def __init__(self, title, author, isbn):self.title = titleself.author = authorself.isbn = isbn
def __str__(self):return f"书名: {self.title}, 作者: {self.author}, ISBN: {self.isbn}"
解释:
-
__init__:初始化书籍对象。 -
__str__:定义对象的字符串表示形式。
步骤4:定义 Library 类
编写一个 Library 类来管理书籍:
class Library(object):def __init__(self, db_config):self.conn = pymysql.connect(**db_config)self.cursor = self.conn.cursor()self.cursor.execute("USE library;")
def __del__(self):self.cursor.close()self.conn.close()
def _execute_query(self, query, params=None):self.cursor.execute(query, params)self.conn.commit()
def add_book(self, book):query = "INSERT INTO books (title, author, isbn) VALUES (%s, %s, %s)"params = (book.title, book.author, book.isbn)self._execute_query(query, params)print(f"书籍《{book.title}》已添加到图书馆。")
def remove_book(self, isbn):query = "DELETE FROM books WHERE isbn = %s"params = (isbn,)self._execute_query(query, params)print(f"ISBN为 {isbn} 的书籍已从图书馆删除。")
def find_book(self, isbn):query = "SELECT title, author, isbn FROM books WHERE isbn = %s"self.cursor.execute(query, (isbn,))result = self.cursor.fetchone()if result:return Book(*result)return None
def list_books(self):query = "SELECT title, author, isbn FROM books"self.cursor.execute(query)results = self.cursor.fetchall()if results:for row in results:print(Book(*row))else:print("图书馆中没有书籍。")def print_menu():print("\n图书管理系统")print("1. 添加书籍")print("2. 删除书籍")print("3. 查找书籍")print("4. 列出所有书籍")print("5. 退出")
解释:
-
__init__和__del__:初始化和销毁对象时的操作,分别是连接和关闭数据库。 -
_execute_query:执行 SQL 查询。 -
add_book、remove_book、find_book和list_books:管理书籍的增、删、查、列操作。
步骤5:编写主程序
编写主程序来实现交互式菜单,让用户选择不同的操作:
if __name__ == "__main__":db_config = {'host': 'localhost','user': 'root', # 替换为你的MySQL用户名'password': '123456', # 替换为你的MySQL密码'charset': 'utf8mb4'}
library = Library(db_config)
while True:print_menu()choice = input("请选择操作(1-5): ")
if choice == '1':title = input("请输入书名: ")author = input("请输入作者: ")isbn = input("请输入ISBN: ")book = Book(title, author, isbn)library.add_book(book)elif choice == '2':isbn = input("请输入要删除的书籍ISBN: ")library.remove_book(isbn)elif choice == '3':isbn = input("请输入要查找的书籍ISBN: ")found_book = library.find_book(isbn)if found_book:print(f"找到书籍: {found_book}")else:print("未找到书籍。")elif choice == '4':library.list_books()elif choice == '5':print("退出系统。")breakelse:print("无效的选择,请重新输入。")
解释:
-
print_menu:打印菜单。 -
主程序:根据用户输入调用不同的图书管理方法。
完整代码
将所有部分结合在一起,形成完整的程序:
import pymysql
class Book(object):def __init__(self, title, author, isbn):self.title = titleself.author = authorself.isbn = isbndef __str__(self):return f"书名: {self.title}, 作者: {self.author}, ISBN: {self.isbn}"class Library(object):def __init__(self, db_config):self.conn = pymysql.connect(**db_config)self.cursor = self.conn.cursor()self.cursor.execute("USE library;")def __del__(self):self.cursor.close()self.conn.close()def _execute_query(self, query, params=None):self.cursor.execute(query, params)self.conn.commit()def add_book(self, book):query = "INSERT INTO books (title, author, isbn) VALUES (%s, %s, %s)"params = (book.title, book.author, book.isbn)self._execute_query(query, params)print(f"书籍《{book.title}》已添加到图书馆。")def remove_book(self, isbn):query = "DELETE FROM books WHERE isbn = %s"params = (isbn,)self._execute_query(query, params)print(f"ISBN为 {isbn} 的书籍已从图书馆删除。")def find_book(self, isbn):query = "SELECT title, author, isbn FROM books WHERE isbn = %s"self.cursor.execute(query, (isbn,))result = self.cursor.fetchone()if result:return Book(*result)return Nonedef list_books(self):query = "SELECT title, author, isbn FROM books"self.cursor.execute(query)results = self.cursor.fetchall()if results:for row in results:print(Book(*row))else:print("图书馆中没有书籍。")@staticmethoddef print_menu():print("\n图书管理系统")print("1. 添加书籍")print("2. 删除书籍")print("3. 查找书籍")print("4. 列出所有书籍")print("5. 退出")if __name__ == "__main__":db_config = {'host': 'localhost','user': 'root', # 替换为你的MySQL用户名'password': '123456', # 替换为你的MySQL密码'charset': 'utf8mb4'}library = Library(db_config)while True:library.print_menu()choice = input("请选择操作(1-5): ")if choice == '1':title = input("请输入书名: ")author = input("请输入作者: ")isbn = input("请输入ISBN: ")book = Book(title, author, isbn)library.add_book(book)elif choice == '2':isbn = input("请输入要删除的书籍ISBN: ")library.remove_book(isbn)elif choice == '3':isbn = input("请输入要查找的书籍ISBN: ")found_book = library.find_book(isbn)if found_book:print(f"找到书籍: {found_book}")else:print("未找到书籍。")elif choice == '4':library.list_books()elif choice == '5':print("退出系统。")breakelse:print("无效的选择,请重新输入。")
相关文章:
程序猿大战Python——实现简单的图书馆系统操作
步骤1:安装和导入库 首先,确保已经安装了 pymysql 库。如果没有安装,请执行以下命令: pip install pymysql 然后,导入必要的库: import pymysql 步骤2:创建数据库和表的函数 编写一个函数来…...
液体粒子计数器的原理及常见型号选择 lighthouse代理商北京中邦兴业
液体颗粒计数用于测量液体样品中颗粒的大小和分布。通过用激光二极管照射液体样品并检测散射光来测量颗粒分布和尺寸。散射光的性质与粒子大小的大小有关。液体颗粒计数器可用于批量取样或在线(连续监测)应用,如水处理厂,或用于…...
Java知识点整理 16 — Spring Bean
在之前的文章 Java知识点整理 8 — Spring 简介 中介绍了 Spring 的两大核心概念 IoC 和 AOP,但对 Spring Bean 的介绍不全面,本文将补充 Spring 中 Bean 的概念。 一. 什么是 Spring Bean 在 Spring 官方文档中,对 bean 的定义为…...
Nvidia Jetson/RK3588+AI双目立体相机,适合各种割草机器人、扫地机器人、AGV等应用
双目立体视觉是基于视差原理,依据成像设备从不同位置获取的被测物体的图像,匹配对应点的位置偏移,得到视差数据,进而计算物体的空间三维信息。为您带来高图像质量的双目立体相机,具有高分辨率、低功耗、远距离等优点&a…...
springboot使用feign调用不依赖cloud
在使用spring boot调用第三方api中,常用的是okhttp、apache http client等,但是直接使用下来还是有点繁琐,需要手动转换实体。 在springcloud中有个openfeign调用,第一次体验到调用接口还能这么丝滑。注解写道接口上,…...
springboot中使用springboot cache
前言:SpringBoot中使用Cache缓存可以提高对缓存的开发效率 此图片是SpringBootCache常用注解 Springboot Cache中常用注解 第一步:引入依赖 <!--缓存--><dependency><groupId>org.springframework.boot</groupId><artifactId…...
Promise,async/await的运用
一,了解Promise Promise是异步编程的一种解决方案,它是一个对象,可以获取异步操作的消息,它的出现避免了地狱回调。 (1)Promise的实例有三个状态: Pending(进行中) Re…...
图论·多源最短路径Floyddijsktra
例题地址 多源最短路径 多个源点多个终点可以使用Floyd算法直接求各源点到终点的最短距离,也可以直接多次使用dijsktra算法求单源点到终点的最短距离 Floyd算法 使用条件 多源最短路径权值正负皆可 核心思想:动态规划 子问题: 设(A,B)…...
微服务 | Springboot整合GateWay+Nacos实现动态路由
1、简介 路由转发 执行过滤器链。 网关,旨在为微服务架构提供一种简单有效的统一的API路由管理方式。同时,基于Filter链的方式提供了网关的基本功能,比如:鉴权、流量控制、熔断、路径重写、黑白名单、日志监控等。 基本功能…...
做google SEO 有哪些好用的工具?这12款谷歌SEO工具值得收藏!
1、Google Trends 谷歌旗下一款基于搜索数据推出的一款免费分析工具 外贸人有句老话,七分靠选品,三分靠运营。在你开始做独立站之前,在你不清楚你的行业在Google上面能否有足够的流量时,那么Google Trends则是你最好的工具。 你只…...
【变频调速在锅炉引风机控制中的应用】
变频调速在锅炉引风机控制中的应用 变频器的选型 变频器是利用电力半导体器件的通断作用将工频电源变换为另一种频率的电能控制装置,能宏观对交流异步电机软启动,变频调速,提高运转精度,改变功率因数,过流/过压/过载保护等功能,国内技术较领先的品牌有汇川、欧瑞(原烟台…...
网络配置(IP、NETMASK、GATEWAY、DNS、DHCP) <持续更新中>
参考: 初学Linux之网络配置(IP、NETMASK、GATEWAY、DNS、DHCP)-CSDN博客【学习笔记】网关 & 路由_网关和路由-CSDN博客【学习笔记】计算机网络 IP地址与MAC地址_根据mac分配ip-CSDN博客【学习笔记】TCP 和 UDP 协议_tcp 发送 syn 应答没有syn ack-CSDN博客 一…...
【ArcGIS 脚本工具】拯救密恐,隐藏唯一值渲染图层的标记符号
最近拿到了【Hello 图狗】制作的三调/变更样式符号库,确实比之前网上下载的版本好用很多。 ArcGIS Pro三调23变更符号库V1.02(汇总)_中大比例尺.stylx和样式属性对调 不过使用过程中触发了一个旧病,就是匹配样式之后,…...
tensorflow学习1.3-创建会话,启动会话
tensorflow学习1.3-创建会话,启动会话 会话的由来与作用由来作用 会话的定义与结构定义 用法基本用法上下文管理器执行部分计算图获取多个结果 总结 练习代码报错原因:TensorFlow 2.x中的Eager Execution使用兼容模式来启用SessionEager Execution和计算…...
QT基本对话框(基本对话框、工具盒类、进度条、调色板与电子钟、可扩展对话框、程序启动画面)
此篇文章通过实例介绍基本对话框的用法。首先介绍标准文件对话框(QFileDialog)、标准颜色对话框(QColorDialog)、标准字体对话框(QFontDialog)、标准输入对话框(QInputDialog)以及标…...
Docker 部署 MariaDB 数据库 与 Adminer 数据库管理工具
文章目录 MariaDBmariadb.cnf开启 binlog Adminerdocker-compose.ymlAdminer 连接 MariaDB MariaDB MariaDB是一个流行的开源关系型数据库管理系统(RDBMS),它是MySQL的一个分支和替代品。 官网:https://mariadb.com/镜像ÿ…...
qt 可以在一个函数中读一个文件,然后再将内容写入另一个文件中
是的,Qt 允许你在一个函数中读取一个文件的内容,并将这些内容写入到另一个文件中。这可以通过结合使用 QFile 和 QTextStream(或 QDataStream,取决于你的具体需求)来实现。以下是一个简单的示例,展示了如何…...
Dijkstra算法C代码
一个带权图n个点m条边,求起点到终点的最短距离 先定义一个邻接矩阵graph,graph[i][j]表示从i到j的距离,i到j没有路就表示为无穷 然后定义一个visit数组,visit[i]表示i结点是否被访问 然后定义一个dist数组,dist[i]表…...
P1064 [NOIP2006 提高组] 金明的预算方案
[NOIP2006 提高组] 金明的预算方案 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置࿰…...
大型企业组网如何规划网络
大型企业组网是一个复杂的过程,它需要细致的规划和设计,以确保网络能够满足企业的业务需求,同时保证性能、安全性和可扩展性。以下是规划大型企业网络的一些关键步骤和考虑因素: 1. 需求分析 业务需求:与各个业务部门…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
