Tkinter程序打包为单EXE后SQLite数据丢失问题求助及解决方案
解决Tkinter+SQLite程序单EXE打包后数据丢失问题
我最近用Python的Tkinter开发了一款指标跟踪GUI工具,基于sqlite3实现数据存储,支持完整的CRUD(创建、读取、更新、删除)操作。在VSCode中运行时一切正常——数据能正常保存,关闭重启后所有数据都能保留,功能毫无问题。
但用auto-py-to-exe将程序打包成单EXE文件后,出现了棘手的问题:运行EXE时可以正常保存数据,然而关闭程序再次打开后,所有数据全部丢失!
为了定位问题,我简化了核心代码,聚焦于生成唯一标识、获取当前时间、数据库创建与校验,以及history和indic两张数据表的增删查等关键功能。
尝试过的无效方案
- 编写了适配PyInstaller临时目录的路径重定义函数,但单EXE模式下的数据丢失问题依然存在
- 切换为单目录打包模式时,数据可以正常保存,但我的需求是单EXE的打包形式
最终可行解决方案
后来采用了Roland Smith的解决方案,将数据库文件存储到用户目录下,成功解决了单EXE模式下的数据丢失问题。关键代码如下:
import os from sqlalchemy import create_engine user_folder = os.environ["HOMEPATH"] engine = create_engine(f'sqlite:///C:\\{user_folder}\\nameofadatabase.db', echo=True)
背后的原理很清晰:单EXE打包后的程序在运行时会将自身解压到临时目录,若将数据库文件存放在该临时路径中,程序关闭后临时目录会被系统删除,数据自然也就丢失了。而将数据库文件存储到用户目录这种持久化路径下,就能确保数据在程序重启后依然保留。
内容的提问来源于stack exchange,提问作者walkingtomron
相关产品推荐
相关产品推荐

