簡體   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