【问题标题】:slqalchemy operational error when executed on boot在启动时执行 sqlalchemy 操作错误
【发布时间】:2018-04-15 15:47:37
【问题描述】:

我有一个用 python 编写的警报脚本,它从 sqlite 数据库收集警报。

如果我执行脚本: python /home/pi/VRobot/alarm.V2.py 一切正常。

当我将它放在 /etc/profile 中执行它并在启动时运行它时,我收到以下错误。

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: reminders [SQL: u'SELECT reminders.id AS reminders_id, reminders.activity AS reminders_activity, reminders.time AS reminders_time, reminders.day AS reminders_day, reminders.song AS reminders_song, reminders.timeofday AS reminders_timeofday \nFROM reminders'] (Background on this error at: http://sqlalche.me/e/e3q8)

/etc/profile 脚本如下所示:

      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

amixer set 'PCM' 100%
python /home/pi/VRobot/alarm.V2.py &

关于为什么脚本在正常运行时运行良好但在启动时执行时却不能正常运行的任何想法?

我是这样做的:

engine = create_engine('sqlite:///foo.db', echo=True)

所以我使用相对路径来连接数据库。

【问题讨论】:

  • 那么你使用什么路径来连接数据库呢?是相对路径还是绝对路径?
  • 该错误通常表明您正在打开与有效路径不同的绝对路径,解析为空数据库。
  • @MartijnPieters 我这样做是这样的:engine = create_engine('sqlite:///foo.db', echo=True) 所以我使用相对路径来连接数据库。

标签: python sqlite sqlalchemy


【解决方案1】:

您正在使用相对路径连接到您的数据库;这使您依赖于当前的工作目录。当您从 /etc/profile 脚本运行时,当前工作目录会有所不同,此时您连接到一个空数据库。

要么将当前工作目录更改为脚本的工作目录(shell 代码中的cd 或 Python 中的 os.chdir()),要么使用绝对路径。

您可以从__file__生成绝对路径:

import os.path

HERE = os.path.dirname(os.path.abspath(__file__))
database_path = os.path.join(HERE, 'foo.db')
database_uri = 'sqlite:///{}'.format(database_path)

然后使用create_engine(database_uri, echo=True)进行连接。

【讨论】:

  • 我选择直接使用绝对路径,效果非常棒!
猜你喜欢
  • 1970-01-01
  • 2013-04-15
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
相关资源
最近更新 更多