编程逻辑思维巩固案列演练

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 文章目录编程逻辑思维巩固案列演练1、项目介绍2.环境准备3.功能实现1.项目主流程和菜单提示2.数据库连接3.添加图书4.修改图书5.图书列表6.查询图书7.删除图书8.借阅图书9.归还图书python操作数据库图书管理小项目

文章目录

编程逻辑思维巩固案列演练

image.png

通过python的面向对象编程,实现一个文字版的图书管理系统

  • 本章节的目的,强化大家编程的逻辑思维能力
  • 知识点
  • 基本的sql增删改查
  • 面向对象的使用

1、项目介绍

  • 功能模块

image.png

  • 图书信息

image.png

2.环境准备

  • 数据存储方式:mysql
  • 创建表
create table books( 
    id int unsigned primary key auto_increment not null, 
    name varchar(20) default '', 
    position varchar(40) default '', 
    status enum('在库','出借') default '在库', 
    borrorwer varchar(20) default '' 
);
  • 插入数据
# 部分列插入语法:=> insert into 表名(列1,...) values(值1,...) 
insert into books(name,position) value('python入门到精通','A区2号架3层'); 
# 全列插入语法=> insert into 表名 values(...) 
insert into books value(0,'python入门到精通','A区2号架3层','在库','');
  • 修改数据
# 修改数据 
update 表名 set 列1=值1,列2=值2... where 条件
  • 删除数据语法
delete from 表名 where 条件;
  • 查询
select * from 表名;
  • python连接mysql数据库
# 安装pymysql 
pip install pymysql
  • 连接数据库
pymysql.connect(
    host='localhost', 
    user='root', 
    password="123456", 
    database='test', 
    port=3306, 
    cursorclass=pymysql.cursors.DictCursor)
  • 创建游标对象
  • 执行sql语句

3.功能实现

1.项目主流程和菜单提示

image.png

  • 1、运行程序,打印提示菜单
  • 2、根据输入不同的选项进行对应的操作

2.数据库连接

  • 通过pymysql连接数据库,封装执行查询语句和修改语句的方法。

3.添加图书

image.png


  • 1、用户依次输入书名、存放位置
  • 2、校验输入的书名和位置是否有值
  • 3、添加图书到数据库
  • 4、提示:
  • 继续添加输入1,回车退回到主菜单

4.修改图书

需求:修改图书只能修改书名和位置信息。

image.png

  • 1、用户输入修改的图书编号,判断id是否存在
  • 2、编号存在则打印改书本的全部信息,并提示用户输入新的书名,和新的位置。
  • 3、根据用户的输入,对图书进行修改
  • 4、提示:
  • 继续添加输入1,回车退回到主菜单

5.图书列表

image.png

  • 查询数据库中所有的图书,打印出来显示

6.查询图书

  • 1、输入书名,查询出与之匹配的图书信息,并打印
  • 2、提示:
  • 继续查询输入1,回车退回到主菜单

7.删除图书

  • 1、输入书籍编号,找到对应的书籍,从数据库中删除
  • 2、提示:
  • 继续删除输入1,回车退回到主菜单


8.借阅图书

  • 1、输入图书编号,查找到该书籍
  • 2、提示用户输入借阅人名字
  • 3、将书籍的状态改为出借,借阅人改为输入的名字
  • 4、提示:
  • 继续添加输入1,回车退回到主菜单

9.归还图书

  • 1、输入图书编号,查找到该书籍
  • 2、将书籍的状态改为在库,借阅人改为空
  • 3、提示:
  • 继续添加输入1,回车退回到主菜单


python操作数据库

pymysql_practice.py

import pymysql
#pymysql连接数据库
con = pymysql.connect( host='localhost',
                 user='root',
                 password="123456",
                 database='lenovo',
                 port=3306,
                 cursorclass=pymysql.cursors.DictCursor)
#创建一个游标对象
cur = con.cursor(cursor=pymysql.cursors.DictCursor) #以字典形式展示数据
#执行sql
sql = "select * from books"
res = cur.execute(sql)
print(res)
#获取查询的结果
result1 = cur.fetchall()
print(result1)
#执行增删改的sql
sql = 'insert into books(name,position) value("天龙八部","A区1号架1层");'
res2 = cur.execute(sql)
#提交事务
con.commit()
print(res2)
con.close()

图书管理小项目

BookManage.py

import pymysql
class DB:
    '''
    项目涉及到数据库的增删查改,咱们封装数据库对应的操作方法来处理
    查询的方法
    增删改的方法
    '''
    def __init__(self):
        # pymysql连接数据库
        self.con = pymysql.connect(host='localhost',
                              user='root',
                              password="123456",
                              database='lenovo',
                              port=3306,
                              cursorclass=pymysql.cursors.DictCursor)
        # 创建一个游标对象
        self.cur = self.con.cursor(cursor=pymysql.cursors.DictCursor)  # 以字典形式展示数据
    def query_sql(self,sql):
        '''
        查询sql方法
        :param sql: sql语句
        :return: 查询得到的结果
        '''
        self.cur.execute(sql)
        return self.cur.fetchall()
    def update_sql(self,sql):
        '''
        :param sql: sql语句
        :return:
        '''
        self.cur.execute(sql)
        self.con.commit()
    def close(self):
        """关闭游标,断开连接"""
        self.cur.close()
        self.con.close()
class Books(DB):
    def add_book(self):
        '''添加图书'''
        print("---------添加图书--------")
        name = input("请输入书名:")
        position = input("请输入图书存放的位置:")
        if name and position:
            sql = "insert into books(name,position) value('{}','{}')".format(name,position)
            self.update_sql(sql)
            print("添加成功!")
        else:
            print("添加失败,书名和位置均不能为空!!!")
        n = input("继续添加请输入1,回车返回主菜单")
        #判断用户输入的是否为1,为1则再次调用添加图书的方法
        if n == "1":
            self.add_book()
        else:
            pass
    def update_book(self):
        '''修改图书'''
        print("----------修改图书------------")
        id = input("请输入要修改图书的ID")
        #打印图书的信息
        res = self.query_sql(f'select * from books where id={id}')
        if res:
            print("当前图书的信息",res)
            # 进行修改
            name = input("请输入新的书名,不修改请输入回车:") or res[0]['name']
            position = input("请输入图书存放的位置,不修改请输入回车:") or res[0]['position']
            sql = f'update books set name = "{name}",position="{position}" where id="{id}"'
            self.update_sql(sql)
            print("修改成功!")
        else:
            print("您输入的书籍id不存在")
        n = input("继续修改请输入1,回车返回主菜单")
        if n == "1":
            self.update_book()
        else:
            pass
    def del_book(self):
        '''删除图书'''
        print("----------删除图书------------")
        id = input("请输入删除图书的id:")
        # 打印图书的信息
        res = self.query_sql(f'select * from books where id={id}')
        if res:
            print("您要删除的书籍信息如下:",res)
            is_delete = input("确认删除请输入1,否则请输入回车:")
            if is_delete == "1" and res[0]["status"]=="在库":
                sql = 'delete from books where id = {id}'
                self.update_sql(sql)
                print("删除成功")
            elif res[0]["status"]=="出借":
                print("本书已出借,无法删除!")
        else:
            print("您输入的书籍id不存在")
        #判断是否要继续删除
        n = input("继续删除请输入1,回车返回主菜单")
        if n == "1":
            self.del_book()
        else:
            pass
    def qurey_book(self):
        '''查询图书'''
        print("----------查询图书------------")
        name = input("请输入要查询的图书名:")
        if name:
            sql = f"select * from books where name = '{name}' "
            res = self.query_sql(sql)
            if res:
                for i in res:
                    print(i)
            else:
                print("图书馆暂无该书籍!")
        else:
            print("书名不能为空!")
        # 判断是否要继续查询
        n = input("继续查询请输入1,回车返回主菜单")
        if n == "1":
            self.qurey_book()
        else:
            pass
    def book_list(self):
        '''图书列表'''
        sql = "select * from books"
        res = self.query_sql(sql)
        print("****************图书列表***************")
        for i in res:
            print(f'编号:{i["id"]},书名:{i["name"]},位置:{i["position"]},'
                  f'转态:{i["status"]},借阅人:{i["borrorwer"]}')
        print("返回主菜单页面")
    def revert_book(self):
        '''归还图书'''
        print("----------删除图书------------")
        id = input("请输入要归还图书的ID:")
        sql = f'select * from books where id = {id}'
        res = self.query_sql(sql)
        if res:
            print("您要归还的图书信息如下:\n",res)
            #查看图书的状态,如果状态为出借,则不能借出
            if res[0]["status"] == "出借":
                status = "在库"
                lend_sql =  f'update books set status="{status}",borrorwer=" " where id="{id}"'
                self.update_sql(lend_sql)
                print("归还成功")
            else:
                print("本书并未出借!")
        else:
            print("请输入正确的图书编号!")
        # 判断是否要继续租借
        n = input("继续归还请输入1,回车返回主菜单")
        if n == "1":
            self.revert_book()
        else:
            pass
    def lend_book(self):
        '''租借图书'''
        print("----------租借图书------------")
        id = input("请输入要租借图书的ID:")
        sql = f'select * from books where id = {id}'
        res = self.query_sql(sql)
        if res:
            print("您要借阅的图书信息如下:\n",res)
            #查看图书的状态,如果状态为出借,则不能借出
            if res[0]["status"] == "出借":
                print("该图书已被借出!")
            else:
                print("本书可借出!")
                borrorwer = input("借书请输入您的名字:")
                status = "出借"
                lend_sql =  f'update books set status="{status}",borrorwer="{borrorwer}" where id="{id}"'
                self.update_sql(lend_sql)
                print("登记成功,借阅成功!")
        else:
            print("图书馆暂无该书籍!")
        # 判断是否要继续租借
        n = input("继续租借请输入1,回车返回主菜单")
        if n == "1":
            self.lend_book()
        else:
            pass
    def quit(self):
        '''退出'''
        self.close()
        print("程序退出!!!")
    def print_menu(self):
        '''打印菜单'''
        print("-----菜单---------")
        print("【1】︰添加图书\n"
              "【2】:修改图书\n"
              "【3】:删除图书\n"
              "【4】:查询图书\n"
              "【5】:图书列表\n"
              "【6】:出借图书\n"
              "【7】:归还图书\n"
              "【8】:退出")
    def main(self):
        print("---------------欢迎进入小仔图书管理系统---------------")
        while True:
            self.print_menu()
            number = input("请输入你的选项:")
            if number == '1':
                self.add_book()
            elif number == "2":
                self.update_book()
            elif number == "3":
                self.del_book()
            elif number == "4":
                self.qurey_book()
            elif number == "5":
                self.book_list()
            elif number == "6":
                self.lend_book()
            elif number == "7":
                self.revert_book()
            elif number == "8":
                self.quit()
                break
            else:
                print("您输入的选项有误!憨批!")
if __name__ == '__main__':
    book = Books()
    book.main()
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
测试技术
探索软件测试的奥秘:从基础到进阶
【10月更文挑战第4天】在软件开发的广阔天地中,测试是保证质量的重要关卡。本文将深入浅出地介绍软件测试的核心概念、类型和实践方法,旨在帮助初学者构建起完整的测试知识体系,同时为有经验的测试工程师提供一些深入探索的方向。我们将一同走进测试的世界,解锁那些隐藏在代码背后的奥秘。
|
1月前
|
程序员
探索编程之美:从逻辑到实践的旅程##
【10月更文挑战第12天】 在当今这个科技飞速发展的时代,编程已经成为了一种基础技能,它不仅是一种技术,更是一种艺术。本文将分享我的编程感悟,从最初的困惑到逐渐掌握编程的逻辑,再到将所学知识应用于实际项目,实现自我价值的提升。正如印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”通过不懈努力和持续学习,我逐渐理解了编程的本质,并在实践中不断提升自己。 ##
24 0
|
2月前
|
算法
探索代码的奥秘:从新手到高手的技术感悟
在技术的海洋中,每一行代码都如同一颗璀璨的星辰,引领着我们探索未知的宇宙。本文将分享一段从编程新手逐步成长为技术高手的旅程,以及在这个过程中积累的一些心得与感悟。
17 4
|
6月前
|
人工智能 算法 Java
程序设计的艺术:深入解析与实战演练
程序设计的艺术:深入解析与实战演练
55 4
|
SQL 存储 缓存
系统设计不知怎么入手?一文帮到你
系统设计不知怎么入手?一文帮到你
104 2
|
算法 搜索推荐
谈一谈|对小白学习算法的建议
谈一谈|对小白学习算法的建议
86 0
|
开发框架 运维 前端开发
万丈高楼平地起,知识点拆解,带你攻破前端开发技能,一起坚持分阶段的巩固复习。
万丈高楼平地起,知识点拆解,带你攻破前端开发技能,一起坚持分阶段的巩固复习。
|
移动开发 资源调度 前端开发
小白如何从项目入手学习前端
前言 已有基础:虽然说是小白,但是本人曾在大一通过freecodecamp平台学习过html5、css中的标签、样式等知识,也曾经用js写过一些简单的算法题,并了解过ES6(不过因为不常用,相当于只记得名字了。
139 0
|
测试技术 Linux 数据库
软件测试需要学习什么?自学和报班学习哪个更好?
如今各大企业对软件测试人才的需求都是非常大的,因此很多人也是看中了其中的可发展前景,纷纷表示想要学习软件测试转行做测试工程师,那么软件测试需要学习什么?怎么学?
260 0
软件测试需要学习什么?自学和报班学习哪个更好?
|
算法 搜索推荐 NoSQL
「编程羽录」上线,程序员必备的这些技能你能get到嘛?
大家好,我是小羽。好久不见,给大家带来个好消息,小羽的全新专题「编程羽录」系列正式上新,主要是介绍一些关于面试题和经验总结的文章。会为大家提供一些技术栈之外,程序员还需要的其他方面硬核知识...
178 0
「编程羽录」上线,程序员必备的这些技能你能get到嘛?