小型Python ERP开发:SQLite托管、备份及预约功能技术问询
针对小型Python ERP开发的核心技术解决方案
阶段1:SQLite数据库托管与自动备份方案
1. SQLite在线托管选择
- 绝对不要用Github托管SQLite文件:Github是代码仓库而非数据库服务,私有仓库也存在权限配置失误导致数据泄露的风险;而且SQLite是单文件数据库,多用户并发读写时会触发文件锁,严重时会损坏数据库文件,完全不适合在线多用户场景。
- 推荐带身份验证的轻量托管方案:
- 用低成本VPS搭建简单服务:在VPS上存放SQLite文件,再用Python写个带API密钥/账号密码验证的小接口(比如Flask服务),ERP程序通过接口读写数据库,避免直接暴露文件;
- 选择支持SQLite的托管平台:优先选带身份验证机制的平台,确保只有你的ERP程序能访问数据库,杜绝未授权访问。
2. 每周自动备份实现
用Python脚本+系统定时任务就能搞定,核心步骤:
- 安全备份数据库:不要直接复制正在运行的SQLite文件,用SQLite内置的
VACUUM INTO命令生成干净的备份文件,避免文件损坏:
import sqlite3 import os from datetime import datetime def backup_db(): db_path = "/path/to/your/database.db" backup_dir = "/path/to/backup/folder" # 生成带时间戳的备份文件名 backup_name = f"backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}.db" backup_path = os.path.join(backup_dir, backup_name) conn = sqlite3.connect(db_path) # 执行VACUUM INTO生成备份 conn.execute(f"VACUUM INTO '{backup_path}'") conn.close() # 可选:压缩备份文件节省空间 import zipfile with zipfile.ZipFile(f"{backup_path}.zip", 'w', zipfile.ZIP_DEFLATED) as zipf: zipf.write(backup_path, os.path.basename(backup_path)) os.remove(backup_path)
- 定时执行备份:
- Linux/macOS:用
cron,编辑定时任务(crontab -e),添加一行:
意思是每周日凌晨2点执行备份脚本;0 2 * * 0 /usr/bin/python3 /path/to/backup_script.py - Windows:用「任务计划程序」,创建定时任务,指定每周固定时间运行Python脚本;
- Linux/macOS:用
- 备份验证:在脚本末尾添加检查逻辑,比如尝试连接备份文件并查询一条基础数据,确保备份有效,避免生成损坏的备份文件。
阶段3:预约日历功能与自动工时添加
1. 预约日历功能开发
根据你的ERP类型选择方案:
- 桌面ERP(新手友好):用
tkcalendar库快速实现,支持月/日视图、事件添加、选择回调:
from tkinter import Tk from tkcalendar import Calendar def on_date_selected(date): # 点击日期时触发,比如弹出窗口添加预约 print(f"Selected date: {date}") root = Tk() cal = Calendar(root, selectmode='day', year=2024, month=5, day=1) cal.pack(pady=20) cal.bind("<<CalendarSelected>>", lambda e: on_date_selected(cal.get_date())) root.mainloop()
把预约数据存到SQLite的appointments表(字段:id, customer_id, appointment_time, status),每次打开日历从数据库加载已有预约。
- Web ERP:用Flask/Django配合前端日历组件,后端提供接口读写预约数据,前端渲染日历视图,适合多用户访问场景。
2. 自动添加90分钟清洁工时
核心是触发逻辑+数据库操作:
- 数据库表设计:
appointments表:存储预约信息,包含appointment_time(datetime类型)、status(标记是否有效,比如已确认/已取消);timesheet表:存储工时,包含employee_id,work_date,hours,note,appointment_id(关联预约ID);
- 自动触发逻辑:
- 每天凌晨运行脚本,检查当天所有已确认的预约,为每个预约添加90分钟工时:
import sqlite3 from datetime import datetime def add_cleaning_hours(): today = datetime.now().date() conn = sqlite3.connect("/path/to/your/database.db") cursor = conn.cursor() # 查询当天已确认的预约 cursor.execute(""" SELECT id FROM appointments WHERE DATE(appointment_time) = ? AND status = 'confirmed' """, (today,)) appointments = cursor.fetchall() for appt_id in appointments: # 检查是否已经添加过对应工时,避免重复 cursor.execute(""" SELECT id FROM timesheet WHERE appointment_id = ? AND work_date = ? """, (appt_id[0], today)) if cursor.fetchone() is None: # 插入90分钟(1.5小时)工时记录 cursor.execute(""" INSERT INTO timesheet (employee_id, work_date, hours, note, appointment_id) VALUES (?, ?, ?, ?, ?) """, (1, today, 1.5, "清洁工时", appt_id[0])) conn.commit() conn.close()
- 用系统定时任务(和备份一样的方式)每天凌晨执行这个脚本,确保当天的预约都能生成对应工时;
- 额外处理:如果预约取消,要删除对应的工时记录,可以在取消预约的接口/按钮逻辑里添加删除工时的代码。
内容的提问来源于stack exchange,提问作者Oliemar
相关产品推荐
相关产品推荐

