繁体   English   中英

sqlite3.OperationalError:无法打开数据库文件 - 一段时间后发生错误

[英]sqlite3.OperationalError: unable to open database file - error occurs after a certain while

工具:

  • 树莓派 3B
  • 树莓派
  • BME280
  • 蟒蛇3
  • 烧瓶
  • Sqlite3

错误代码:

Traceback (most recent call last):
  File "BME280_DataCollector.py", line 65, in <module>
  File "BME280_DataCollector.py", line 45, in logData
sqlite3.OperationalError: unable to open database file

在 Raspbian 上工作并希望将我的传感器数据存储在 sqlite3 数据库中。 不知何故出现以下错误代码:“sqlite3.OperationalError:无法打开数据库文件”。

首先,我认为我请求数据库文件太快,将测量时间更改为分钟,但错误仍然可以重现。

我通过 df /tmp 查看了 /tmp。 但是这个文件系统被 12% 使用并且没有过载。

此外,我尝试通过 chmod 提供完整路径以及数据库的所有写入和读取权限,但也没有什么不同。 另外,我把代码的完整路径。

此外,我尝试尝试和异常方法,但也没有成果。

尽管如此,我想知道这种失败是否发生在与数据库进行一定数量的交互时。 我发现它总是在第 1020 次交互时停止。

我还尝试使用 shell 脚本重新启动 python 脚本,但由于缺乏经验和知识,它没有成功。

代码:


from flask import Flask,render_template,url_for,request,redirect, make_response, send_file
import random
import json
from time import sleep
from random import random
from flask import Flask, render_template, make_response
import datetime

import sqlite3
import sys

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import io
import os

import smbus2
import bme280


## FUNCTIONS ##
# get data
def getBMEdata():
    port = 1
    adress = 0x77
    bus = smbus2.SMBus(port)
    calibration_params = bme280.load_calibration_params(bus, adress)
        
    bme_data = bme280.sample(bus, adress, calibration_params)
    temp = '%.2f' % bme_data.temperature
    hum = '%.2f' % bme_data.humidity
    press = '%.2f' % bme_data.pressure
    
    now = datetime.datetime.now() #get time
    timeString = now.strftime('%d-%m-%Y %H:%M:%S') #write time to string
        
    return temp, hum, press, timeString

# function to insert data on a table
def logData(temp, hum, press, timeString):
    conn = sqlite3.connect(dbname)
    curs = conn.cursor()
    curs.execute("INSERT INTO BME280_data values((?), (?), (?), (?))", (timeString, temp, hum, press))
    conn.commit()
    conn.close()
        
# display data base
def displayData():
    conn = sqlite3.connect(dbname)
    curs = conn.cursor()
    print("\nEntire database contents:\n")
    for row in curs.execute("SELECT * FROM BME280_data"):
        print(row)
    conn.close()
    
## MAIN
if __name__ == '__main__':
    count = 0
    dbname = '/home/pi/projects/SmartPlanting/Sensors_Database/sensorsData.db'
    sampleFreq = 60 #data collect every minute
    while True:
        temp, hum, press, timeString = getBMEdata() #get data
        logData(temp, hum, press, timeString) #save data
        sleep(sampleFreq) #wait
        displayData() #show in terminal
        #count = count+1
        #print(count)

也许有人已经解决了这个问题,或者可以给我一个与flask一起使用的sqlite3的替代方案。

建议:添加更完整的异常处理例程,因为您的堆栈跟踪可能更冗长。

但是从您的跟踪来看,有问题的第 45 行可能是这样的: conn.commit() (或上面的行)。 Python 已经在帮助您查明错误。 函数 logData 有问题。

可能是您向表 BME280_data 提供了不正确的数据? 要调试您的应用程序,我强烈建议您打印日志您尝试插入的数据(使用日志记录模块输出到文件和/或控制台)。 我不知道您的表的结构,但您的某些字段的定义(数据类型)可能与您尝试插入的数据不兼容。 您能够以可预测的方式重现问题这一事实很有说服力,我的直觉是数据可能是原因。

总结一下:现在就养成良好的习惯,至少添加基本的异常处理。 一个质量应用程序应该有异常处理和日志错误,以便他们可以被人工审查和纠正。 这对于无人值守的应用程序更为重要,因为您不在控制台前,您甚至可能没有机会看到发生的问题。

这是一个可能有帮助的教程: https : //code.tutsplus.com/tutorials/error-handling-logging-in-python--cms-27932

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM