Python-Tinydb数据库详解

news2024/11/24 14:34:12

目录

数据库

Tinydb 

Tinydb 使用

安装

导入

创建数据库

创建 table

其他函数

示例

最后


数据库

数据库就是存储数据的的地方,现在我们生活中几乎每时每刻做的事可能都有它的作用。今天来介绍 Tinydb 数据库,它适合初学者,非常容易上手。

Tinydb 

说起数据库,大家可能主要想到 mysql,mogodb 这些比较常见的,但是他们对于初学者来说有点难, Tinydb 是比较简单易入门的数据库,总共只用了 1800 行 Python 代码,不依赖外部库,储存方式主要是 json 文件,也就是 Python 中的字典类型。

Tinydb 使用

安装

cmd 输入,

pip install tinydb

按回车,等待安装完成。

导入

from tinydb import TinyDB, Query, where

后面的 TinyDB,Query ,where 都是常用的功能,一会讲。

创建数据库

这时呢,我们就要使用 TinyDB() 功能来创建数据库,并把它保存在一个变量里。

如:

db = TinyDB('db.json')

注意这里的 T 和 DB 都是需要大写的,不然会报错。

主要格式就是:

变量 = TinyDB('数据库名.json')

其中 json 是文件后缀名,变量我们后面称之为数据库变量。

创建 table

table 可以形象的理解为一个表。

创建 table 的语句示例是这样的:

login_table = login_db.table("login")

大概格式是这样的:

table变量名 = 数据库变量名("table名")

数据库主要的功能就是增、删、查、改,现在来学习增。

增就是添加数据,既插入数据。

插入数据使用 insert() 函数,格式为

table变量名.insert({键:值,键:值...})

比如数据库是这样的

nameage
小明25
李华23

这时我们要插入一条数据,姓名是 小红 ,年龄是 24,我们可以这样写:

table变量名.insert({"name":"小红","age":22})

table变量名需要在之前定义。

主要使用 remove 函数。

但是,我们首先要创建一个查询变量,格式为:

查询变量名 = Quary()

还是使用上面那个数据库,比如我们要删除 年龄 是24岁及以上的数据,可以这样写:

table变量.remove(查询变量名.age>=24)

这边可能有人不明白,删除数据为什么要用查询变量呢?

因为年龄是24岁以上实质要查找age属性>=24的数据,所以用查找。

在 "删" 中,我们创建了查询变量,查只需 search() 函数:

数据变量名 = table变量名.search(查询变量名.属性 ...)

还是那个例子,查找24岁以上的数据,可以这样写:

data = table变量名.search(查询变量名.age >= 24)

其实改就是更新,更新用 update()函数,比如我们要把小红的年龄改成100,可以这样写:

table变量.update({"age":100},where("name")=="小红")

小红:你干嘛~哎哟~

其他函数

使用 all() 函数可以获取数据库里全部内容,

data = table名.all()

示例

到这里,基本的函数都讲完了,接下来可以看一下示例

这是一个简单的餐厅系统,主要用到 Tinydb 储存数据

import sys
import time
from tinydb import TinyDB, Query, where
import os
import random

flag = 0

if not os.path.exists("restaurant"):
    os.makedirs("restaurant")

# ------------------------------------ #

login_db = TinyDB("restaurant/login.json") #存储登录和注册信息
login_table = login_db.table("login")

# ----------------------------------- #

dish_info_db = TinyDB("restaurant/dish_info.json") #存储菜品信息
dish_info_table = dish_info_db.table("dish_info")

# ------------------------------------ #

pingjia_db = TinyDB("restaurant/pingjia.json")
pingjia_table = pingjia_db.table("pingjia")

# ----------------------------------- #


os.system("cls")
print("""-------欢迎光临----------
        1.登录 
        2.注册
        3.管理员登录
------------------------   """)
choose = int(input("请输入:"))
if choose == 1:
    name = input("请输入用户名:")
    search_name = Query()
    # 查询一个用户名为 name 的数据
    query_data = login_table.search(search_name.name == name)
    if query_data == []:
        print("无此用户名!")
    password = int(input("请输入密码(纯数字):"))
    if password == query_data[0]["password"]:
        submit_ = query_data[0]["submit"]
        user_name = name
        print("登录成功!")
    elif password != query_data[0]["password"]:
        print("密码错误!")
elif choose == 2:
    name = input("请输入用户名:")
    search_name_2 = Query()
    query_data_2 = login_table.search(search_name_2.name == name)
    if query_data_2 == []:
        password = int(input("请输入密码(纯数字):"))
        login_table.insert({"name":name, "password":password, "submit":0})
        submit_ = 0
        user_name = name
        print("注册成功!")
    else:
        print("用户名已存在!")
elif choose == 3:
    name = input("输入管理员用户名:")
    password = int(input("输入管理员密码:"))
    if name == "root" and password == 123456:
        flag = 1
        print("登录成功!")
else:
    print("输入错误!")

# ------------------------------------------------------ #
if flag == 0:
    while True:
        os.system("cls")
        print(user_name, end=' ')
        if submit_ < 10:
            print("普通会员")
        elif submit_ >= 10 and submit_ <= 20:
            print("黄金会员")
        elif submit_ > 20:
            print("钻石会员")
        print("""-------------------
            1.点餐
            2.评价
            3.退出
            4.看评价
-------------------
                    """)
        op = int(input("请输入:")) 
        if op == 1:
            dish_info_query = Query()
            dish_info_list = dish_info_table.all()
            # print(dish_info_list)
            get_dish_dic = {}
            spend_dic = {}
            bag = []
            spend_yuan = 0
            while True:
                os.system("cls")
                for i in range(len(dish_info_list)):
                    print(str(i+1)+'.'+dish_info_list[i]["dish_name"]+"    "+str(dish_info_list[i]["dish_spend"])+"元")
                    get_dish_dic[i+1]=[dish_info_list[i]["dish_name"]]
                    spend_dic[i+1]=[dish_info_list[i]["dish_spend"]]
                # print(get_dish_dic)
                print(str(len(dish_info_list)+1)+".购物车")
                print(str(len(dish_info_list)+2)+".我点好了")
                print(str(len(dish_info_list)+3)+".放弃")
                op3 = int(input("请选择:"))
                if  op3 <= (len(dish_info_list)):
                    spend_yuan += int(spend_dic[op3][0])
                    bag.append(get_dish_dic[op3])
                    print("成功!")
                    os.system("pause")
                elif op3 == len(dish_info_list)+1:
                    print("\n购物车:")
                    for j in bag:
                        print(j)
                    os.system("pause")
                elif op3 == len(dish_info_list)+2:
                    os.system("cls")
                    dz = random.randint(75,100)
                    print("你获得一个"+str(dz/100)+"折优惠↓")
                    dz_=dz/100
                    os.system("pause")
                    os.system("cls")
                    # ----------- #
                    print("用户名:"+user_name)
                    print("价格:  原价"+str(spend_yuan)+"元   折后价"+str(int(spend_yuan*dz_))+"元")
                    print("你点的菜品:")
                    for z in bag:
                        print(z)
                    _pswd = int(input("输入密码以支付(输入0则放弃支付):"))
                    if _pswd == password:
                        print("提交成功!")
                        login_table.update({"submit": submit_+1}, where("name")==user_name)
                        submit_ += 1
                        # ----------------- #
                        os.system("pause")
                        break
                    elif _pswd == 0:
                        os.system("pause")
                        break
                    else:
                        print("密码错误!")
                        break
                    os.system("pause")
                elif op3 == len(dish_info_list)+3:
                    os.system("pause")
                    break
        elif op == 2:
            os.system("cls")
            pingjia_info = input("请输入评价内容:")
            pingjia_table.insert({"content":pingjia_info,"user":name, "time":time.strftime('%Y-%m-%d-%H_%M_%S',time.localtime(time.time()))})
        elif op == 3:
            sys.exit()
        elif op == 4:
            pingjia_list = pingjia_table.all() 
        for i in pingjia_list:
            print("评价人:"+str(i["user"]))
            print("评价内容:"+str(i["content"]))
            print("评价时间:"+str(i["time"]))
            print("\n\n")
            os.system('pause')
elif flag == 1:
    os.system("cls")
    print("管理员")
    print("""-------------------
        1.添加菜品
        2.查看评价
        3.查看用户
-------------------
                """)
    op1 = int(input("请输入:"))
    if op1 == 1:
        dish_name = input("请输入菜品名字:")
        dish_spend = int(input("请输入菜品价格:"))
        dish_info_table.insert({"dish_name":dish_name, "dish_spend":dish_spend})
        print("添加成功!")
    elif op1 == 2:
        pingjia_list = pingjia_table.all() 
        for i in pingjia_list:
            print("评价人:"+str(i["user"]))
            print("评价内容:"+str(i["content"]))
            print("评价时间:"+str(i["time"]))
            print("\n\n")
    elif op1 == 3:
        login_list_ = login_table.all()
        for i in login_list_:
            print("用户名       密码      下单次数")
            print(i["name"],end='     ')
            print(str(i["password"]),end='    ')
            print(str(i["submit"]))

最后

这样,整篇文章也就写完了。是不是十分简单?如有问题可以评论。

下次预告:

\int_{-\pi }^{\pi }\sin x dx

使用 Python 求积分。

拜拜~欢迎三连~

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

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

相关文章

设计模式概述之建造者模式(五)

常说的设计模式是23种设计模式&#xff0c;分为3大类&#xff1a; 创建型模式5种&#xff1a;工厂方法、抽象工厂、单例、建造者、原型 结构型模式7种&#xff1a;适配器、代理、桥接、装饰者、外观、享元、组合 行为型模式11种&#xff1a;模板方法、解释器、策略、观察者、…

【如意如意顺遂我意快快显灵】

文章目录 ● 【猿如意安装】 &#xff08;基于Windows环境安装&#xff09; ● 【猿如意首页】 ● 【猿如意效率工具】 ● 【猿如意开发工具】 ● 【猿如意教程文档】 ● 【猿如意一行代码】 ● 【猿如意ChatGPT】 ● 【Markdown笔记】 猿如意官网&#xff1a;猿…

【码极客精讲】二叉树

二叉树&#xff08;Binary tree&#xff09;是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式&#xff0c;即使是一般的树也能简单地转换为二叉树&#xff0c;而且二叉树的存储结构及其算法都较为简单&#xff0c;因此二叉树显得特别重要。二叉树特点…

Linux yum 命令

yum&#xff08; Yellow dog Updater, Modified&#xff09;是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理&#xff0c;能够从指定的服务器自动下载 RPM 包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装所有依赖…

Go 微服务开发框架 DMicro 的设计思路

Go 微服务开发框架 DMicro 的设计思路 DMicro 源码地址: Gitee:dmicro: dmicro是一个高效、可扩展且简单易用的微服务框架。包含drpc,dserver等 背景 DMicro 诞生的背景&#xff0c;是因为我写了 10 来年的 PHP&#xff0c;想在公司内部推广 Go, 公司内部的组件及 rpc 协议都…

Python:whl文件简介及实践

文章目录简介一、安装过程二、whl源地址推荐小结简介 WHL文件是以Wheel格式保存的Python安装包&#xff0c;Wheel是Python发行版的标准内置包格式。在本质上是一个压缩包&#xff0c;WHL文件中包含了Python安装的py文件和元数据&#xff0c;以及经过编译的pyd文件&#xff0c;…

【视觉高级篇】27 # 如何实现简单的3D可视化图表:GitHub贡献图表的3D可视化?

说明 【跟月影学可视化】学习笔记。 第一步&#xff1a;准备要展现的数据 可以使用这个生成数据&#xff1a;https://github.com/sallar/github-contributions-api 这里直接使用月影大佬的github提交数据的数据即可 结构大致如下&#xff1a; 第二步&#xff1a;用 SpriteJS…

黑*头条_第6章_kafka及异步通知文章上下架

黑*头条_第6章_kafka及异步通知文章上下架 文章目录黑*头条_第6章_kafka及异步通知文章上下架1)自媒体文章上下架2)kafka概述3)kafka安装配置4)kafka入门5)kafka高可用设计5.1)集群5.2)备份机制(Replication&#xff09;6)kafka生产者详解6.1)发送类型6.2)参数详解7)kafka消费者…

小林Coding阅读笔记:操作系统篇之硬件结构,CPU Cache一致性问题

前言 参考/导流&#xff1a; 小林coding-2.4 CPU 缓存一致性学习意义 底层基础知识&#xff0c;了解CPU执行过程&#xff0c;让上层编码有效并发控制底层设计思维&#xff08;对比 MySQL的并发控制&#xff09;、更好地去理解JUC的锁、volatile以及JMM架构层面的一致性保证问…

毕业设计 单片机便携式空气质量检测仪 - 物联网 嵌入式

文章目录0 前言1 简介2 主要器件3 实现效果4 设计原理5 部分核心代码5 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长…

51.`.format`字符串格式化—最适合小白的格式化笔记

51..format字符串格式化 文章目录51..format字符串格式化1.课题导入2.知识回顾3..format的基本用法3.1{}为空3.2 {}中有编号3.3 {}中有变量名4.浮点数的格式化5..format官方语法6. .format格式化语法总结7. 总结8.课堂练习1.课题导入 【描述】 用input函数输入你每个月的工资…

MySQL中WHERE后跟着N多个OR条件会怎样...

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;叶金荣文章来源&#xff1a;社区原创 可能会执行非常慢&#xff0c;线上生产环境千万别写出这种SQL ... 背景交…

Docker+Gitlab+Jenkins+Springboot

安装Gitlab 开放防火墙端口80和配置映射文件夹 firewall-cmd --zonepublic --add-port80/tcp --permanent firewall-cmd --reload mkdir -p /docker_data/gitlab/{data,logs,config}启动Gitlab容器&#xff08;启动容器之前确保80&#xff0c;443端口没用被占用&#xff0c;被…

H3C双点双向路由引入,以及使用路由策略进行路由控制,路由学习的配置

如下拓扑中&#xff0c;存在两个路由域&#xff0c;左边为isis区域&#xff0c;所有设备均为level-1-2角色。右边为ospf区域&#xff0c;所有使能ospf的接口均在area0区域中&#xff1a; 组网中需要在R1和R3上&#xff0c;分别将各自的isis路由引入到ospf进程中&#xff0c;同时…

Go C 编程 第9课 放飞汽球(魔法学院的奇幻之旅 Go C编程绘图)

Goc编程第八课 Goc编程第八课_哔哩哔哩_bilibili Goc编程第九课 Goc编程第九课_哔哩哔哩_bilibili 59.实心椭圆 (魔法学院第9课) 难度&#xff1a;1 登录 60.双色椭圆 (魔法学院第9课) 难度&#xff1a;1 登录 61.气球串 (魔法学院第9课) 登录 62.同心圆环 (魔法学院第9课…

C++类与对象的应用—日期计算器

目录 一、前言 二、日期类的实现 检查日期的合法性 < 运算符重载 运算符重载 <运算符重载 >运算符重载 >运算符重载 !运算符重载 进一步优化 日期天数 日期天数 日期-天数 日期-天数 前置&&后置 前置--&&后置-- 思路&#…

强化学习的基础知识和6种基本算法解释

强化学习的基础知识和概念简介&#xff08;无模型、在线学习、离线强化学习等&#xff09; 机器学习(ML)分为三个分支:监督学习、无监督学习和强化学习。 监督学习(SL):关注在给定标记训练数据的情况下获得正确的输出无监督学习(UL):关注在没有预先存在的标签的情况下发现数据…

[附源码]Python计算机毕业设计Django校园疫情防范管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

我的周刊(第070期)

我的信息周刊&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。&#x1f3af; 项目streamlit[1]用 Python 快速构建数据应用&#xff1…

微信公众号开发—通过网页授权实现业务系统登录及用户绑定(微信网页授权自动登录业务系统)

&#x1f60a; 作者&#xff1a; 一恍过去&#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390&#x1f38a; 社区&#xff1a; Java技术栈交流&#x1f389; 主题&#xff1a; 微信公众号开发—通过网页授权实现业务系统登录及用户绑定(微信网页授权自…