生产环境下Cron任务执行Python编写的SQLite插入语句时报错:表不存在
解决Cron执行Python SQLite脚本时提示“no such table”的问题
这种问题我碰到过好多次了,核心原因其实是Cron的运行环境和你手动执行脚本时不一样,尤其是工作目录的差异,导致SQLite连接到了错误的数据库文件!
你手动执行脚本时,工作目录是/root/spider,所以SQLite能正确找到你的数据库文件;但Cron默认的工作目录是用户的主目录(比如/root),如果你的代码里用了相对路径连接数据库(比如sqlite3.connect('db.sqlite3')),Cron执行时会在/root下创建一个新的空数据库文件,自然找不到dibbs_spider_dibbs_fields表。
下面是几个针对性的解决方案:
方案1:在代码里指定数据库的绝对路径
打开你的dibbs5.py,找到连接SQLite数据库的代码行,把相对路径改成绝对路径。比如:
# 原来的相对路径写法(会出问题) conn = sqlite3.connect('db.sqlite3') # 改成绝对路径(替换成你实际的数据库文件路径) conn = sqlite3.connect('/root/spider/db.sqlite3')
这样不管脚本在哪个工作目录下执行,都能精准找到正确的数据库文件。
方案2:在Cron任务里先切换到脚本目录再执行
修改你的Cron配置,在执行Python脚本前先通过cd命令切换到/root/spider目录:
33 09 * * * cd /root/spider && DISPLAY=:0 /usr/bin/python3 dibbs5.py > /root/spider/dibbserorr3.log 2>&1
这样Cron执行时的工作目录就和你手动执行时一致了,相对路径也能正确解析。
方案3:排查验证(可选)
如果你还不确定问题所在,可以在Cron任务里添加打印工作目录的命令,把结果输出到日志里:
33 09 * * * cd /root/spider && pwd && DISPLAY=:0 /usr/bin/python3 dibbs5.py > /root/spider/dibbserorr3.log 2>&1
查看dibbserorr3.log里的pwd输出,确认工作目录是否正确;另外可以检查/root目录下有没有生成新的空数据库文件,这也能验证是不是路径解析错误导致的问题。
内容的提问来源于stack exchange,提问作者Rikky Bhai
相关产品推荐
相关产品推荐

