15分钟学 Python 第29天 : 数据库基础

news2024/9/29 13:22:53

Day 29: 数据库基础

在本次课程中,我们将进一步构建我们的简易银行系统,并引入数据库的概念。我们将学习如何使用SQLite作为我们的数据存储解决方案,从而使得我们的银行系统具备持久性和可扩展性。

章节大纲

  1. 项目背景
  2. 数据库设计
  3. SQLite 基础
  4. 实现数据库交互的银行系统
  5. 示例代码
  6. 流程图
  7. 练习题和项目扩展

1. 项目背景

上一次我们建立了一个简单的银行账户管理系统,但是所有数据都保存在内存中,程序关闭后数据就消失了。引入数据库之后,我们的银行系统将不仅允许我们持久化存储账户数据,还能实现对账户信息的高效查询与管理。

2. 数据库设计

在设计数据库之前,我们需要明确我们的数据存储需求。我们需要存储用户的基本信息和交易记录。以下是我们数据库的设计表格:

表名列名数据类型描述
accountsidINTEGER主键,自动递增
ownerTEXT账户拥有者的姓名
balanceREAL账户余额
created_atDATETIME账户创建时间
transactionsidINTEGER主键,自动递增
account_idINTEGER外键,关联到账户表
amountREAL交易金额
transaction_typeTEXT交易类型(存款/取款)
created_atDATETIME交易时间

3. SQLite 基础

SQLite是一个轻量级的关系型数据库,非常适合小型应用程序。SQLite不需要单独的服务器,它将数据库存储在文件系统中。

安装SQLite

在Python中,可以使用内置的sqlite3模块,无需额外安装。

pip install sqlite3
创建数据库和表

我们可以通过以下代码创建数据库及相关表。

import sqlite3

# 创建或连接到数据库
connection = sqlite3.connect('bank_system.db')

# 创建游标
cursor = connection.cursor()

# 创建账户表
cursor.execute('''
CREATE TABLE IF NOT EXISTS accounts (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    owner TEXT NOT NULL,
    balance REAL NOT NULL DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
''')

# 创建交易表
cursor.execute('''
CREATE TABLE IF NOT EXISTS transactions (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    account_id INTEGER,
    amount REAL NOT NULL,
    transaction_type TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (account_id) REFERENCES accounts (id)
)
''')

# 提交更改并关闭连接
connection.commit()
connection.close()

4. 实现数据库交互的银行系统

现在,我们来实现我们之前的银行账户管理系统,并将其与数据库进行交互。我们将创建一个新的类 BankAccount,并更新其方法以支持数据库操作。

银行账户类代码
import sqlite3

class BankAccount:
    def __init__(self, owner):
        self.owner = owner
        self.connection = sqlite3.connect('bank_system.db')
        self.cursor = self.connection.cursor()
        self.account_id = self.create_account()

    def create_account(self):
        self.cursor.execute("INSERT INTO accounts (owner) VALUES (?)", (self.owner,))
        self.connection.commit()
        return self.cursor.lastrowid

    def deposit(self, amount):
        self.cursor.execute("UPDATE accounts SET balance = balance + ? WHERE id = ?", (amount, self.account_id))
        self.cursor.execute("INSERT INTO transactions (account_id, amount, transaction_type) VALUES (?, ?, ?)",
                            (self.account_id, amount, 'Deposit'))
        self.connection.commit()

    def withdraw(self, amount):
        self.cursor.execute("SELECT balance FROM accounts WHERE id = ?", (self.account_id,))
        balance = self.cursor.fetchone()[0]
        if amount > balance:
            print("Insufficient funds!")
        else:
            self.cursor.execute("UPDATE accounts SET balance = balance - ? WHERE id = ?", (amount, self.account_id))
            self.cursor.execute("INSERT INTO transactions (account_id, amount, transaction_type) VALUES (?, ?, ?)",
                                (self.account_id, amount, 'Withdraw'))
            self.connection.commit()

    def get_balance(self):
        self.cursor.execute("SELECT balance FROM accounts WHERE id = ?", (self.account_id,))
        return self.cursor.fetchone()[0]

    def get_transaction_history(self):
        self.cursor.execute("SELECT amount, transaction_type, created_at FROM transactions WHERE account_id = ?",
                            (self.account_id,))
        return self.cursor.fetchall()

    def close(self):
        self.connection.close()

5. 示例代码

现在我们来测试这个使用SQLite的银行账户系统:

# 创建一个新的账户
account = BankAccount("Alice")

# 存款
account.deposit(200)
account.deposit(150)

# 取款
account.withdraw(100)

# 查询余额
print(f'Current Balance: {account.get_balance()}')

# 查看交易记录
print("Transaction History:")
for transaction in account.get_transaction_history():
    print(transaction)

# 关闭数据库连接
account.close()
代码运行流程图

以下是代码执行的流程图,帮助理解各个模块的工作流程:

+---------------------+
|     创建账户       |
+---------------------+
          |
          v
+---------------------+
|      存款          |
+---------------------+
          |
          v
+---------------------+
|      取款          |
+---------------------+
          |
          v
+---------------------+
|    查询余额        |
+---------------------+
          |
          v
+---------------------+
|查看交易记录        |
+---------------------+
          |
          v
+---------------------+
|       关闭连接     |
+---------------------+

6. 练习题和项目扩展

练习题
  1. 优化查询:实现查询余额和交易记录时的性能优化。
  2. 删除账户功能:添加功能以允许用户删除他们的账户,并且相应地删除相关的交易记录。
  3. 更新账户信息:实现一个方法用于更新账户的拥有者信息。
  4. 错误处理:为数据库操作添加错误处理机制,增强程序的健壮性。
项目扩展
  • 多用户支持:扩展系统以支持多个用户注册和登录。
  • 图形界面:使用Tkinter为系统提供图形用户界面。
  • 命令行界面(CLI):实现一个简单的命令行界面以供用户交互。
  • 数据备份功能:实现定期备份数据库内容的功能。

总结

通过本次课程,我们成功将我们的简易银行系统与SQLite数据库进行了集成,学习了SQLite的基本操作。现在,系统的数据可以持久化存储,大大增强了系统的实用性和可扩展性。同时,通过练习题和项目扩展,您可以在此基础上继续深化您的学习。


怎么样今天的内容还满意吗?再次感谢观众老爷的观看。
最后,祝您早日实现财务自由,还请给个赞,谢谢!

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

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

相关文章

深入浅出MongoDB(三)

深入浅出MongoDB(三) 文章目录 深入浅出MongoDB(三)复制副本集设置分片分片实例备份与恢复监控ObjectId 复制 复制时将数据同步在多个服务器的过程,提供了数据的冗余备份,在多个服务器上存储数据副本&#…

操作平台使用中应每月不少于几次定期检查?

在当今数字化时代,操作平台作为企业与个人日常运营的核心载体,其稳定性和安全性直接关系到业务的高效运行与数据的严密保护。因此,定期进行操作平台的检查与维护,成为了不可忽视的重要环节。特别是,确保每月进行不少于…

肯富来 CRM 数字化项目启动,引领企业“智”变新时代

近年来,广东肯富来泵业股份有限公司(以下简称“肯富来”)开启企业数字化、智能化转型之路,利用云计算技术贯通全制程的信息化管理系统、通过高速网络端到端全覆盖实现生产可视化,并通过远程数据系统,帮助客…

日志的艺术:深入理解 spdlog

目录 1. 为什么需要日志? 2. 同步日志 vs. 异步日志 3. spdlog 的核心组成部分 4. 如何创建一个Logger 5. 如何选择输出目标(Sink) 6. 个性化你的日志格式 7. 异步日志的魔法 8. 刷新策略:何时将日志写入 9. 调整线程池&…

强化学习入门——Pybullet初体验

Pybullet 最近一直在想如何进行RL的学习,在学习RL的过程中,好的模拟仿真平台是非常重要的。除了Gym,还了解到Pybullet模块可以简便快捷地创建仿真环境,所以学习一下。 1.简介 PyBullet 是一个用于机器人学、游戏开发和图形研究…

mycat读写分离中间件

5、部署Mycat读写分离中间件服务 5.1安装Mycat服务 将Mycat服务的二进制软件包Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz上传到Mycat虚拟机的/root目录下,并将软件包解压到/use/local目录中 5.2赋予解压后的mycat目录权限 5.3向/etc/profile系统变量…

PyQt5与Html的关于地图位置显示的动态交互

PyQt5与Html的关于地图位置显示的动态交互 1 前言2 python部分3 HTML代码4 注意总结 1 前言 上篇本是放弃关于Folium的动态显示,但是在仔细对比Folium在python的直接应用与Html中的写法,其实两者没有什么区别,都是基于Leaflet上建立区域&…

[大语言模型-论文精读] 词性对抗性攻击:文本到图像生成的实证研究

[大语言模型-论文精读] 词性对抗性攻击:文本到图像生成的实证研究 目录 文章目录 [大语言模型-论文精读] 词性对抗性攻击:文本到图像生成的实证研究目录文章研究背景 文章标题摘要1 引言2 相关工作3 数据集创建3.1 数据收集3.2 目标提示生成3.3 数据集注…

[ACS_C]:以 H2和 O2等离子体处理的 Al2O3为载体的 Pt 催化剂用于液态有机氢载体对二苄基甲苯和全氢二苄基甲苯的加氢和脱氢

摘要:二苄基甲苯 (DBT) 是一种很有前途的液态有机氢载体 (LOHC),理论储氢量为 6.2 wt%,可与可再生能源发电系统耦合。本工作采用一种方便、环保的等离子体处理方法改性氧化铝表面羟基和表面氧空位 (SOV)。通过浸渍处理后的氧化铝制备了不同的…

如何修复变砖的手机并恢复丢失的数据

您可能之前听说过“变砖”,但您知道什么是变砖手机吗?正如许多论坛中经常提出的问题一样,我如何知道我的手机是否变砖了?好吧,手机变砖主要有两种类型,即软件变砖和硬变砖。软变砖手机意味着重启后您仍然可…

MATLAB guide选择图片和全局变量使用

文章目录 前言一、按键选取文件二、全局化变量使用全局华使用 总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要: 提示:以下是本篇文章正文内容,下面案例可供参考 一、按键选取文件 [filename,pathname]…

想要编辑 PDF 文件?使用这 10 种最佳 PDF 编辑工具

您是否遇到过利益干系人要求您对 PDF 文件进行细微更改的情况? 通常我们会这样做! 但是,对你来说,做出要求的改变有多难呢? 好吧,当您没有用于创建 PDF 文件的源文件时,问题就来了。是的&…

如何选购适合自己的内衣洗衣机?五款热门卓越型号测评推荐

相信不少小伙伴都跟我一样,一方面,认为内裤、袜子与大件的上衣、裤子放一块清洗,会感觉很不卫生,而且穿在身上也不安心。但是另一方面,本身又很懒惰,也不想自己用手洗,不但经常会遗漏一些污渍&a…

探索 DaPy:Python 中的 AI 数据处理新贵

文章目录 探索 DaPy:Python 中的 AI 数据处理新贵背景介绍DaPy 是什么?如何安装 DaPy?DaPy 的简单函数使用方法加载数据数据筛选数据聚合数据可视化自定义函数 DaPy 在实际场景中的应用数据预处理数据分析数据处理与集成 常见 Bug 及解决方案…

蓝牙资讯|2024可穿戴市场的手表将出现下滑,耳机和戒指将增长

市场调查机构 IDC 发布博文,预测 2024 年全球可穿戴设备出货量达到 5.379 亿台,同比增长 6.1%。IDC 预计新兴市场的进一步普及和成熟市场的更新周期的开始将推动听力设备的发展,因为消费者希望更换大流行病时期购买的产品。 IDC 预估 2024 …

VS2017安装Installer Projects制作Setup包

下载安装扩展包 VS2017默认未安装Installer Projects Package,需要联机下载: 也可网页上下载离线InstallerProjects.vsix文件: https://visualstudioclient.gallerycdn.vsassets.io/extensions/visualstudioclient/microsoftvisualstudio20…

Spring Boot 进阶-Spring Boot 如何实现自定义的过滤器详解

在上一篇文章中我们讲解了关于拦截器的相关内容,并且通过一个防抖的例子来讲解了拦截器在实际开发中的使用。这篇文章我们为大家带来的就是关于过滤器的相关内容的分享。下面我们首先来介绍一下什么是过滤器。 什么是过滤器? 过滤器Filter,是Servlet技术中最常用的技术,开…

K8S精进之路-控制器DaemonSet -(3)

介绍 DaemonSet就是让一个节点上只能运行一个Daemonset Pod应用,每个节点就只有一个。比如最常用的网络组件,存储插件,日志插件,监控插件就是这种类型的pod.如果集群中有新的节点加入,DaemonSet也会在新的节点创建出来…

【Router】路由功能之DMZ(Demilitarized Zone)功能介绍及实现

DMZ(Demilitarized Zone) DMZ(非军事化区域)是一个位于内部网络和外部网络之间的分段区域。在一个网络中,DMZ通常包含运行公共服务的服务器或其他设备。 DMZ是一个位于内部网络和外部网络之间的分段区域,用…

wpa_cli支持EAP-TLS认证运行设计

wpa_cli支持EAP-TLS认证运行设计 1 输入 1.1启动wpa_supplicant 和 wpa_cli 在OpenHarmony开发板或华为开发机的命令行中输入 wpa_supplicant -Dnl80211 -c/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf -gabstract:/data/service/el1/public/wifi/sock…