图书管理系统Chapter4——mysql数据储存

104 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

功能程序

初始化

  • mysql数据初始化 建两个数据表一个是allbook一个是borrowtable。 在这里插入图片描述 allbook(所有书单)相关数据信息: 在这里插入图片描述 borrowtable(借书单)相关数据信息: 在这里插入图片描述

  • 用户信息初始化 管理员(admsg)和普通用户(usermsg)

admsg = {'李元': '111', '王二': '222', '张三': '333'}
usermsg = {'小芳': '444', '婷婷': '555', '小辉': '666'}

显示借书单

import pymysql
def display_book():
    '''连接database'''
    conn = pymysql.Connect(
        host='localhost',  # 数据库ip地址
        port=3306,  # 端口号
        user='a Fang',  # 用户名
        passwd='123456',  # 密码
        db='2020.11.10',  # 数据库名称
        charset='utf8'
    )

    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    # 输出所有的书
    sql = "select book from borrowtable"
    cursor.execute(sql)
    data = cursor.fetchall()
    library_books = []
    for book in data:
        library_books.append(book[0])
    print("全书为", library_books)
    conn.close()
    cursor.close()
    return


增加书籍

判定表中书目是否存在,如果存在对数目改动,反之插入单条图书数据。

from easygui import *
import pymysql
def append_book():
    append_msg = []
    append_msg = multenterbox("添加新书", "图书管理系统", ["id", "书名", "作者", "数目"])
    # 连接database
    conn = pymysql.Connect(
        host='localhost',  # 数据库ip地址
        port=3306,  # 端口号
        user='a Fang',  # 用户名
        passwd='123456',  # 密码
        db='2020.11.10',  # 数据库名称
        charset='utf8'
    )

    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()

    sql = "SELECT * FROM allbook WHERE book='%s'AND author='%s'" % (append_msg[1], append_msg[2])
    cursor.execute(sql)
    results = cursor.fetchone()
    # 如果在表中则对已有的图书amount进行更新
    if results:
        sql = "UPDATE allbook SET amount=amount+%d WHERE name='%s' AND author='%s'" % (
            int(append_msg[3]), append_msg[1], append_msg[2])
        cursor.execute(sql)
        # 涉及写操作要注意提交

        conn.commit()
    # 如果没有在表中则插入一条图书数据
    else:
        sql = "INSERT INTO allbook VALUES('%d','%s','%s','%d')" % (
            int(append_msg[0]), append_msg[1], append_msg[2], int(append_msg[3]))
        cursor.execute(sql)
        # 提交
        conn.commit()
    conn.close()

删除书籍

from easygui import *
import pymysql
def delete_book():
    '''删除booktable中指定的全部书籍'''
    # 连接database
    conn = pymysql.Connect(
        host='localhost',  # 数据库ip地址
        port=3306,  # 端口号
        user='a Fang',  # 用户名
        passwd='123456',  # 密码
        db='2020.11.10',  # 数据库名称
        charset='utf8'
    )

    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    sql = "select book from allbook"
    cursor.execute(sql)
    data = cursor.fetchall()
    books = []
    for book in data:
        books.append(book[0])
    print("借书列表为", books)
    # 删除书籍
    while True:
        de_book = choicebox(msg='请选择要删除的书', title='图书管理系统', choices=books)
        print("hhhhhhh", de_book, type(de_book))
        sql1 = "SELECT * FROM allbook WHERE book='%s'" % de_book
        cursor.execute(sql1)
        result = cursor.fetchone()
        if result:
            # 如果在表中则对已有的图书进行修改
            # SQL 删除语句
            sql2 = "DELETE FROM allboook WHERE book='%s'" % (de_book)
            try:
                # 执行SQL语句
                cursor.execute(sql2)
                # 提交修改
                conn.commit()
            except:
                # 发生错误时回滚
                conn.rollback()
            finally:
                # 最终关闭数据库连接
                conn.close()
            break
        # 未找到书直接返回未找到
        else:
            print("没有你要删除的书")
            continue

通过ID查找书籍

使用pymysql操作mysql数据表查找某个数据:

  • fetchone() :

    返回单个的元组,也就是一条记录(row),如果没有结果 则返回 None。

  • fetchall() : 接收全部的返回结果行。

  • fetchmany(self, size=None): 接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.

from easygui import *
import pymysql
def search_book():
    # 查找书籍
    search_msg = enterbox("输入需找书的id", "图书借阅系统")
    # 在数据库图书表中找到指定的信息
    # 连接database
    conn = pymysql.Connect(
        host='localhost',  # 数据库ip地址
        port=3306,  # 端口号
        user='a Fang',  # 用户名
        passwd='123456',  # 密码
        db='2020.11.10',  # 数据库名称
        charset='utf8'
    )
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    sql = "SELECT * FROM allbook WHERE id='%s'" % (search_msg)
    # 执行sql语句
    cursor.execute(sql)
    res = cursor.fetchone()
    if res:
        print("书名:%s 作者:%s." % (res[1], res[2]))
    else:
        print("没有您所要查询的图书")
    # 关闭数据库连接
    conn.close()

全部书单

import pymysql
def all_book():
    '''输出所有的书单allbook'''
    # 连接database
    conn = pymysql.Connect(
        host='localhost',  # 数据库ip地址
        port=3306,  # 端口号
        user='a Fang',  # 用户名
        passwd='123456',  # 密码
        db='2020.11.10',  # 数据库名称
        charset='utf8'
    )

    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    sql = "select book from allbook"
    cursor.execute(sql)
    data = cursor.fetchall()
    library_books = []
    for book in data:
        library_books.append(book[0])
    print("全书列表为", library_books)
    conn.close()
    cursor.close()

借书

from easygui import *
import pymysql
def borrow_book():
    # 连接database
    conn = pymysql.Connect(
        host='localhost',  # 数据库ip地址
        port=3306,  # 端口号
        user='a Fang',  # 用户名
        passwd='123456',  # 密码
        db='2020.11.10',  # 数据库名称
        charset='utf8'
    )

    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    borrow_msg = []
    borrow_msg = multenterbox("借书", "图书借阅系统", ["id"])
    sql = "SELECT * FROM allbook WHERE id='%s'" % (borrow_msg[0])
    cursor.execute(sql)
    result = cursor.fetchone()
    print("您要借阅的书籍书名:%s 作者:%s 当前剩余:%d本 借后剩余:%d本" % (result[1], result[2], result[3], result[3] - 1))
    # 如果在表中则对已有的图书amount进行更新
    if result:
        sql1 = "UPDATE allbook SET amount=amount-%d WHERE id='%s'" % (1, borrow_msg[0])
        cursor.execute(sql1)
        # 涉及写操作要注意提交
        conn.commit()
        sql2 = "UPDATE borrowtable SET amount=amount+%d WHERE id='%s'" % (1, borrow_msg[0])
        cursor.execute(sql2)
        # 提交
        conn.commit()
    # 未找到书直接返回未找到
    else:
        print("没有你要借的书")
    # 关闭数据库连接
    conn.close()
    return

还书

还书与借书操作差不多,唯一区别在于对两个表的操作有一些区别。

from easygui import *
import pymysql
def return_book():
    '''归还图书,如在借表中,借表该书数目减一,图书表书目加一,反之返回不存在'''
    borrow_msg = []
    borrow_msg = multenterbox("还书", "图书借阅系统", ["id"])
    # 连接database
    conn = pymysql.Connect(
        host='localhost',  # 数据库ip地址
        port=3306,  # 端口号
        user='a Fang',  # 用户名
        passwd='123456',  # 密码
        db='2020.11.10',  # 数据库名称
        charset='utf8'
    )

    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    sql1 = "SELECT * FROM allbook WHERE id='%d'" % (int(borrow_msg[0]))
    cursor.execute(sql1)
    result = cursor.fetchone()

    # print("您要归还的书籍书名:%s 作者:%s 当前剩余:%d本 还后:%d本" % (result[1], result[2], result[3],result[3]+1))
    # 如果在表中则对已有的图书amount进行更新
    if result:
        sql = "UPDATE allbook SET amount=amount+%d WHERE id='%s'" % (1, borrow_msg[0])
        cursor.execute(sql)
        # 涉及写操作要注意提交
        conn.commit()
        sql1 = "UPDATE borrowtable SET amount=amount-%d WHERE id='%s'" % (1, borrow_msg[0])
        cursor.execute(sql1)
        # 提交
        conn.commit()
    # 未找到书直接返回未找到
    else:
        print("没有该书")
    # 关闭数据库连接
    conn.close()
    return

登录

from easygui import *
import  Login
import Operate
#初始化
admsg = {'李元': '111', '王二': '222', '张三': '333'}
usermsg = {'小芳': '444', '婷婷': '555', '小辉': '666'}
def choice(cchoices):
    # 用户登录前身份选择
    if (cchoices == '管理员'):
        Login.login(admsg)
        while 1:
            c = choicebox(msg='请选择下列操作', title='管理员系统', choices=['查看借书书单', '添加书籍', '删除书籍', '退出'])
            if c != '退出':
                Operate.operate(c)
            else:
                msgbox("欢迎下次使用")
                break
    elif (cchoices == '普通用户'):
        Login.login(usermsg)
        while 1:
            c = choicebox(msg='请选择下列操作', title='学生操作系统', choices=['借书', '还书', '输入id查书', '查看书单', '退出'])
            if c != '退出':
                Operate.operate(c)
            else:
                msgbox("欢迎下次使用")
                break
    else:
        return 0

密码验证

注意哦lista是形参,传入admsg,usermsg(实参)起作用。

from easygui import *
def login(lista):
    # 登录,验证用户输入的信息
    user_info = []
    user_info = multpasswordbox(msg='请输入登录信息', title='Login', fields=('用户名', '密码'))
    name = user_info[0]
    password = user_info[1]
    if name in lista.keys():
        targp = lista[name]
        if targp == password:
            return (1)
        else:
            login(lista)
    else:
        msgbox("该用户不存在或账户错误,请重新输入")
        login(lista)

##功能选择

import Display_book
import Append_book
import Delete_book
import Search_book
import All_book
import Borrow_book
import Return_book
def operate(op_choice):
    # 用户选择操作界面,!登录后才可以选择
    if op_choice == '查看借书书单':
        Display_book.display_book()
    elif op_choice == '添加书籍':
        Append_book.append_book()
    elif op_choice == '删除书籍':
        Delete_book.delete_book()
    elif op_choice == '输入id查书':
        Search_book.search_book()
    elif op_choice == '查看书单':
        All_book.all_book()
    elif op_choice == '借书':
        Borrow_book.borrow_book()
    elif op_choice == '还书':
        Return_book.return_book()

主程序

# 图书管理系统
from easygui import *
import pymysql
import Choice
# 连接database
conn = pymysql.Connect(
    host='localhost',  # 数据库ip地址
    port=3306,  # 端口号
    user='a Fang',  # 用户名
    passwd='123456',  # 密码
    db='2020.11.10',  # 数据库名称
    charset='utf8'
)

# 得到一个可以执行SQL语句的光标对象
cursor = conn.cursor()
# 执行SQL语句
# cursor.execute(sql)
# 关闭光标对象
# cursor.close()
# 关闭数据库连接
conn.close()
cchoices = 0
if __name__ == "__main__":
    msgbox('欢迎进入图书管理系统', 'Library')
    while 1:
        cchoices = buttonbox(msg='选择登陆方式', title='Library', choices=('普通用户', '管理员'))
        if cchoices is None:
            break
        else:
            Choice.choice(cchoices)

程序架构

在这里插入图片描述具体的程序运行架构在我的前几篇文章中,大家可以看看哦!

MySQL使用问题提醒

  • 设置密码的时候一定要记住! 如果密码忘记了,可以试试重装,再设密码,如果不想重装可以试试网上教程,更改密码,降低权限,其实都蛮复杂(反正我是没有试好)
  • 记得使用cmd跑一遍数据库! 如果登录数据库做基本的操作都不可以,建议再看看教程,和书。
  • 使用cmd的时候记得使用管理员身份启动(出现下面这种情况) 在这里插入图片描述

就这些啦,有问题的话,大家一起学习咯!!!