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

Day 29: 数据库基础

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

章节大纲

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

1. 项目背景

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

2. 数据库设计

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

表名 列名 数据类型 描述
accounts id INTEGER 主键,自动递增
owner TEXT 账户拥有者的姓名
balance REAL 账户余额
created_at DATETIME 账户创建时间
transactions id INTEGER 主键,自动递增
account_id INTEGER 外键,关联到账户表
amount REAL 交易金额
transaction_type TEXT 交易类型(存款/取款)
created_at DATETIME 交易时间

3. SQLite 基础

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

安装SQLite

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

bash 复制代码
pip install sqlite3
创建数据库和表

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

python 复制代码
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,并更新其方法以支持数据库操作。

银行账户类代码
python 复制代码
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的银行账户系统:

python 复制代码
# 创建一个新的账户
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()
代码运行流程图

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

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

6. 练习题和项目扩展

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

总结

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


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

相关推荐
以后不吃煲仔饭几秒前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师1 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者5 分钟前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
The_Ticker6 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
程序猿阿伟7 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
Elastic 中国社区官方博客13 分钟前
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
jwolf213 分钟前
摸一下elasticsearch8的AI能力:语义搜索/vector向量搜索案例
人工智能·搜索引擎
企鹅侠客17 分钟前
ETCD调优
数据库·etcd
有Li22 分钟前
跨视角差异-依赖网络用于体积医学图像分割|文献速递-生成式模型与transformer在医学影像中的应用
人工智能·计算机视觉
Json_1817901448023 分钟前
电商拍立淘按图搜索API接口系列,文档说明参考
前端·数据库