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

问题描述

工具:

错误代码

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,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,timeString):
    conn = sqlite3.connect(dbname)
    curs = conn.cursor()
    curs.execute("INSERT INTO BME280_data values((?),(?),(?))",(timeString,temp,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,timeString = getBMEdata() #get data
        logData(temp,timeString) #save data
        sleep(sampleFreq) #wait
        displayData() #show in terminal
        #count = count+1
        #print(count)

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

解决方法

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

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

可能是您将错误的数据馈送到表BME280_data吗?为了调试您的应用程序,我强烈建议您打印记录要尝试插入的数据(使用 logging 模块输出到文件和/或控制台)。我不知道您的表的结构,但是您的某些字段可能具有与您要插入的数据不兼容的定义(数据类型)。您能够以可预测的方式重现该问题,这确实可以说明问题,而我的直觉是,数据可能是原因。

总结:现在要养成良好的习惯,并至少添加基本的异常处理。 高质量的应用程序应具有异常处理和日志错误,以便人工检查和修复。对于无人值守的应用程序来说,这一点尤为重要,因为您不在控制台的前面,甚至没有机会看到发生的问题。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...