Python 语言 用 SQLite 开发个人记账本 多账户管理 + 月度收支统计 + 报表导出

Python阿木 发布于 1 天前 4 次阅读


Python SQLite 个人记账本开发指南

随着经济的发展和个人财务管理的需求日益增长,开发一个个人记账本软件成为了一个实用的项目。本文将围绕Python语言和SQLite数据库,介绍如何开发一个具备多账户管理、月度收支统计和报表导出功能的个人记账本。

系统需求分析

在开始编码之前,我们需要明确系统的需求:

1. 多账户管理:用户可以创建多个账户,每个账户可以独立记录收支。
2. 月度收支统计:系统可以按照月份统计每个账户的收入和支出。
3. 报表导出:用户可以将统计结果导出为CSV文件,方便查看和打印。

技术选型

- 编程语言:Python
- 数据库:SQLite
- GUI框架:Tkinter(可选,用于创建图形界面)

数据库设计

我们需要设计数据库的结构。以下是几个必要的表:

1. `accounts`:存储账户信息。
2. `transactions`:存储交易记录。

sql
CREATE TABLE accounts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
account_name TEXT NOT NULL,
balance REAL NOT NULL
);

CREATE TABLE transactions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
account_id INTEGER NOT NULL,
date TEXT NOT NULL,
amount REAL NOT NULL,
type TEXT NOT NULL, -- 'income' 或 'expense'
description TEXT,
FOREIGN KEY (account_id) REFERENCES accounts (id)
);

Python代码实现

1. 数据库连接和操作

python
import sqlite3

def create_connection(db_file):
""" 创建数据库连接 """
conn = None
try:
conn = sqlite3.connect(db_file)
except sqlite3.Error as e:
print(e)
return conn

def create_table(conn, create_table_sql):
""" 创建表 """
try:
c = conn.cursor()
c.execute(create_table_sql)
except sqlite3.Error as e:
print(e)

def add_account(conn, account):
""" 添加账户 """
sql = ''' INSERT INTO accounts(account_name,balance)
VALUES(?,?) '''
cur = conn.cursor()
cur.execute(sql, account)
conn.commit()
return cur.lastrowid

def add_transaction(conn, transaction):
""" 添加交易记录 """
sql = ''' INSERT INTO transactions(account_id,date,amount,type,description)
VALUES(?,?,?,?,?) '''
cur = conn.cursor()
cur.execute(sql, transaction)
conn.commit()
return cur.lastrowid

2. 月度收支统计

python
def get_monthly_summary(conn, year, month):
""" 获取月度收支统计 """
cur = conn.cursor()
cur.execute('''SELECT t.account_id, a.account_name, SUM(t.amount) as total
FROM transactions t
JOIN accounts a ON t.account_id = a.id
WHERE strftime('%Y-%m', t.date) = ? AND t.type = ?
GROUP BY t.account_id''', (year, month))
return cur.fetchall()

3. 报表导出

python
import csv

def export_to_csv(data, filename):
""" 导出数据到CSV文件 """
with open(filename, 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['Account Name', 'Total'])
for row in data:
writer.writerow(row)

GUI界面设计(可选)

如果你想要一个图形界面,可以使用Tkinter来创建:

python
import tkinter as tk
from tkinter import ttk

def create_gui():
root = tk.Tk()
root.title("Personal Accounting Book")

创建账户
def add_account_gui():
...(此处省略添加账户的代码)

添加交易
def add_transaction_gui():
...(此处省略添加交易的代码)

统计报表
def generate_report_gui():
...(此处省略生成报表的代码)

创建菜单
menu = tk.Menu(root)
root.config(menu=menu)
accounts_menu = tk.Menu(menu, tearoff=0)
menu.add_cascade(label="Accounts", menu=accounts_menu)
accounts_menu.add_command(label="Add Account", command=add_account_gui)
transactions_menu = tk.Menu(menu, tearoff=0)
menu.add_cascade(label="Transactions", menu=transactions_menu)
transactions_menu.add_command(label="Add Transaction", command=add_transaction_gui)
reports_menu = tk.Menu(menu, tearoff=0)
menu.add_cascade(label="Reports", menu=reports_menu)
reports_menu.add_command(label="Generate Report", command=generate_report_gui)

root.mainloop()

总结

本文介绍了如何使用Python和SQLite开发一个个人记账本。通过数据库设计、Python代码实现和可选的GUI界面设计,我们可以创建一个功能齐全的记账本软件。这个项目可以作为个人学习Python和数据库设计的实践案例。