Python - 使用带有Daemonize的SQlite3时找不到表错误

时间:2017-11-16 15:08:27

标签: python sqlite python-daemon

我有一个访问SQl​​ite数据库的slack bot。当我在前台运行机器人时,一切正常,但是当我将它作为守护进程运行时,它似乎连接到我的数据库但是然后返回"表未找到"在我运行的每个查询上。

问题是,这一直有效,直到我的最新版本,我无法找到改变的内容,因此我将一个精简版本作为测试,但我仍然遇到同样的问题。见下文:

import syslog
import sqlite3
import os
from daemonize import Daemonize
from slackclient import SlackClient
from qatoken import token

#Slack vars
nickname = "NetBot-QA"
dump = "#net-dump-qa"
channel = "#net-alerts-qa"
avatar = ":loader:"

#Daemonize vars
pid = "/tmp/netbot-qa.pid"
app = "net-bot-qa"
syslog.openlog('netbot', 0, syslog.LOG_LOCAL4 )

###################################################### MAIN
def main():

    sc = SlackClient(token)
    sc.api_call("chat.postMessage", username=nickname, channel=dump, text="{0}/net-alerts-test.db".format(os.path.dirname(__file__)), icon_emoji=avatar)

    try:
        conn = sqlite3.connect("{0}/net-alerts-test.db".format(os.path.dirname(__file__)))
        c = conn.cursor()
        c.execute("SELECT * from maint_calendar")
        sc.api_call("chat.postMessage", username=nickname, channel=dump, text="made it!", icon_emoji=avatar)
    except (SystemExit, KeyboardInterrupt):
        raise
    except Exception, e:
        sc.api_call("chat.postMessage", username=nickname, channel=dump, text="The bot crashed", icon_emoji=avatar)
        syslog.syslog("error: {0}".format(e))

########################################################################################
#main()
########################################################################################
#main()
daemon = Daemonize(app=app, pid=pid, action=main)
daemon.start()    

如果我运行main(),我会收到松散的消息" Made it!",但如果我将其注释掉并运行daemon.start(),我会得到#34; The bot应声"

当我cat / var / log / messages时,这就是我所看到的:

Nov 16 09:47:37 server1 netbot: error: no such table: maint_calendar

[root@server1 net-alerts]# pwd
/opt/bots/net-alerts

[root@server1 net-alerts]# sqlite3 net-alerts-test.db
SQLite version 3.7.17 2013-05-20 00:56:22
sqlite> .schema
CREATE TABLE maint_calendar (start time, finish time, summary text, dc_tag text, provider text, CONSTRAINT start_sum PRIMARY KEY (start, summary));

我也尝试使用到db的静态路径运行它,但是os.path.dirname与我使用的每个其他脚本都运行良好。我发现另一篇文章说你必须在守护进程上下文(main())中建立数据库连接,但我从一开始就这样做了。我的想法已经不多了。

2 个答案:

答案 0 :(得分:1)

在我看来,这一行:

conn = sqlite3.connect("{0}/net-alerts-test.db".format(os.path.dirname(__file__)))

实际上是连接到两个不同的源,具体取决于你是守护进程还是只运行main()。

只需将文件保存到全局变量中,稍后再使用。 E.g:

DB_PATH = "{0}/net-alerts-test.db".format(os.path.dirname(__file__))
...
def main():

    sc = SlackClient(token)
    sc.api_call("chat.postMessage", username=nickname, channel=dump, text="{0}/net-alerts-test.db".format(os.path.dirname(__file__)), icon_emoji=avatar)

    try:
        conn = sqlite3.connect(DB_PATH)

答案 1 :(得分:1)

我有同样的问题。我已经对数据库文件的完整路径进行了硬编码,并且可以正常工作!

示例:

dbconn = sqlite3.connect("/home/pi/db.db")
cur = dbconn.cursor()
cur.execute("INSERT INTO raw_data(id, packet, db_insert_time, sync) VALUES(NULL, ?, ?, ?)", ('Line', x, 'N'))

dbconn.commit()
print('DB Insert success!')