<think>
我们使用SQLite作为数据库,因为它轻量且无需单独服务器,适合小型应用。
另外,我们将使用Python内置的sqlite3模块,无需额外安装。
我们将设计一个简单的财产管理表,包含以下字段:
id: 主键,自增
item_name: 物品名称
category: 分类
purchase_date: 购买日期
price: 价格
description: 描述
创建数据库和表,然后实现基本的增删改查功能。
代码步骤:
1. 连接数据库,如果不存在则创建。
2. 创建表(如果不存在)。
3. 实现增加财产记录的函数。
4. 实现删除财产记录的函数(根据id)。
5. 实现修改财产记录的函数(根据id)。
6. 实现查询所有财产记录的函数。
7. 关闭数据库连接(在每次操作后我们选择关闭,或者使用上下文管理器,但为了简单,我们在每个函数中打开和关闭连接)。
8. 另外,为了安全,我们使用参数化查询来防止SQL注入。
我们编写一个类来封装这些操作。
注意:在实际应用中,你可能需要更复杂的错误处理,这里为了简洁,省略了部分错误处理。
</think>
# Python 财产管理系统 - SQLite3 解决方案
## 推荐方案
对于Python财产管理功能,我推荐使用SQLite3作为数据库模块,原因如下:
- **内置支持**:Python标准库自带,无需额外安装
- **轻量级**:单个文件数据库,适合小型应用
- **免配置**:无需数据库服务器
- **支持完整SQL特性**:满足财产管理需求
下面是完整的财产管理系统实现:
```python
import sqlite3
from sqlite3 import Error
import datetime
class AssetManager:
def __init__(self, db_file="assets.db"):
"""初始化数据库连接"""
self.conn = None
try:
self.conn = sqlite3.connect(db_file)
self.create_table()
print(f"成功连接到数据库 {db_file}")
except Error as e:
print(f"数据库连接错误: {e}")
def create_table(self):
"""创建财产信息表"""
sql = """
CREATE TABLE IF NOT EXISTS assets (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
category TEXT CHECK(category IN ('现金', '银行', '投资', '房产', '车辆', '贵重物品')),
value REAL NOT NULL,
purchase_date DATE,
description TEXT,
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
"""
try:
c = self.conn.cursor()
c.execute(sql)
self.conn.commit()
except Error as e:
print(f"创建表错误: {e}")
def add_asset(self, name, category, value, purchase_date=None, description=None):
"""添加新财产"""
sql = """
INSERT INTO assets(name, category, value, purchase_date, description)
VALUES(?,?,?,?,?)
"""
try:
c = self.conn.cursor()
c.execute(sql, (name, category, value, purchase_date, description))
self.conn.commit()
print(f"成功添加财产: {name}")
return c.lastrowid
except Error as e:
print(f"添加财产错误: {e}")
return None
def update_asset(self, asset_id, name=None, category=None, value=None, description=None):
"""更新财产信息"""
updates = []
params = []
if name:
updates.append("name = ?")
params.append(name)
if category:
updates.append("category = ?")
params.append(category)
if value is not None:
updates.append("value = ?")
params.append(value)
if description:
updates.append("description = ?")
params.append(description)
if not updates:
print("没有可更新的字段")
return False
params.append(asset_id)
sql = f"UPDATE assets SET {', '.join(updates)} WHERE id = ?"
try:
c = self.conn.cursor()
c.execute(sql, params)
self.conn.commit()
print(f"成功更新财产 ID: {asset_id}")
return True
except Error as e:
print(f"更新财产错误: {e}")
return False
def delete_asset(self, asset_id):
"""删除财产"""
sql = "DELETE FROM assets WHERE id = ?"
try:
c = self.conn.cursor()
c.execute(sql, (asset_id,))
self.conn.commit()
if c.rowcount > 0:
print(f"成功删除财产 ID: {asset_id}")
return True
print(f"未找到财产 ID: {asset_id}")
return False
except Error as e:
print(f"删除财产错误: {e}")
return False
def get_assets(self, category=None):
"""获取财产列表"""
sql = "SELECT * FROM assets"
params = ()
if category:
sql += " WHERE category = ?"
params = (category,)
try:
c = self.conn.cursor()
c.execute(sql, params)
rows = c.fetchall()
if not rows:
print("没有找到财产记录")
return []
# 转换为字典列表
columns = [col[0] for col in c.description]
return [dict(zip(columns, row)) for row in rows]
except Error as e:
print(f"查询财产错误: {e}")
return []
def get_total_value(self):
"""计算财产总值"""
sql = "SELECT SUM(value) FROM assets"
try:
c = self.conn.cursor()
c.execute(sql)
total = c.fetchone()[0]
return total if total else 0.0
except Error as e:
print(f"计算总值错误: {e}")
return 0.0
def close(self):
"""关闭数据库连接"""
if self.conn:
self.conn.close()
print("数据库连接已关闭")
# 使用示例
if __name__ == "__main__":
# 创建资产管理器
manager = AssetManager()
# 添加财产
manager.add_asset("活期存款", "银行", 50000.0, "2023-01-15", "工商银行活期账户")
manager.add_asset("股票投资", "投资", 120000.0, "2022-05-20", "A股科技股")
manager.add_asset("婚戒", "贵重物品", 15000.0, "2020-08-08", "1克拉钻戒")
# 更新财产
manager.update_asset(2, value=135000.0, description="A股科技股 - 已增值")
# 查询特定类别财产
print("\n投资类财产:")
investments = manager.get_assets(category="投资")
for asset in investments:
print(f"{asset['id']}: {asset['name']} - ¥{asset['value']:,.2f}")
# 获取所有财产
print("\n所有财产:")
all_assets = manager.get_assets()
for asset in all_assets:
print(f"{asset['id']}: {asset['name']} ({asset['category']}) - ¥{asset['value']:,.2f}")
# 计算总价值
total = manager.get_total_value()
print(f"\n财产总值: ¥{total:,.2f}")
# 删除财产
# manager.delete_asset(3)
# 关闭连接
manager.close()
```
## 代码解释
### 1. 数据库设计
- `assets` 表包含以下字段:
- `id`: 主键,自动递增
- `name`: 财产名称
- `category`: 财产类别(现金、银行、投资等)
- `value`: 财产价值
- `purchase_date`: 购买日期
- `description`: 详细描述
- `last_updated`: 最后更新时间(自动记录)
### 2. 核心功能
- **`create_table()`**: 初始化数据库表结构
- **`add_asset()`**: 添加新财产记录
- **`update_asset()`**: 更新现有财产信息
- **`delete_asset()`**: 删除财产记录
- **`get_assets()`**: 查询财产(可按类别筛选)
- **`get_total_value()`**: 计算财产总值
### 3. 安全特性
- 使用参数化查询防止SQL注入
- 数据类型验证(如金额必须是实数)
- 类别枚举检查(确保输入合法类别)
### 4. 使用示例
- 演示初始化数据库
- 添加、更新、删除和查询财产
- 计算财产总值
## 进阶优化建议
1. **数据加密**:使用SQLite的加密扩展(如SQLCipher)保护敏感数据
2. **备份功能**:添加定期数据库备份方法
3. **汇率支持**:增加多币种支持
4. **可视化报表**:集成Matplotlib生成财产分布图表
5. **用户认证**:添加简单的登录验证功能