当前位置: 首页 > news >正文

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

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 sqlite3class BankAccount:def __init__(self, owner):self.owner = ownerself.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.lastrowiddef 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的基本操作。现在,系统的数据可以持久化存储,大大增强了系统的实用性和可扩展性。同时,通过练习题和项目扩展,您可以在此基础上继续深化您的学习。


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

相关文章:

  • “不关心⚠️Warning”的代价:http自动升级https导致免费的存储服务扣费
  • 磁盘管理器
  • 多表查询。
  • 在不受支持的 Mac 上安装 macOS Sequoia (OpenCore Legacy Patcher v2.0.1)
  • 基于单片机电容测量仪仿真设计
  • go语言实现新增代码单测覆盖率
  • Qt 智能指针
  • 探索 DaPy:Python 中的 AI 数据处理新贵
  • GEE APP:实现在线计算全球任何区域森林年度损失可视化应用
  • 深入探讨AI 神经网络:类型、特点与创新应用
  • Vue3动态导入后端路由
  • EasyExcel全面实战:掌握多样化的Excel导出能力
  • 华为OD真题机试-英文输入法(Java)
  • 滚雪球学MySQL[8.1讲]:MySQL扩展功能
  • centos7.9使用docker容器方式部署jenkins环境
  • Javascript Math对象和Date对象常用方法详解
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • js作用域和this的理解
  • leetcode386. Lexicographical Numbers
  • Linux快速复制或删除大量小文件
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • PV统计优化设计
  • Python 基础起步 (十) 什么叫函数?
  • Spark学习笔记之相关记录
  • Travix是如何部署应用程序到Kubernetes上的
  • XML已死 ?
  • 安装python包到指定虚拟环境
  • 动态魔术使用DBMS_SQL
  • 基于web的全景—— Pannellum小试
  • 基于游标的分页接口实现
  • 近期前端发展计划
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 我的业余项目总结
  • 线上 python http server profile 实践
  • 用Visual Studio开发以太坊智能合约
  • ​iOS安全加固方法及实现
  • # linux从入门到精通(三)
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (层次遍历)104. 二叉树的最大深度
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)创业的注意事项
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @SpringBootApplication 包含的三个注解及其含义
  • [<事务专题>]
  • [18] Opencv_CUDA应用之 基于颜色的对象检测与跟踪