0

ツーリング:

  • ラズベリーパイ3B
  • ラズビアン
  • BME280
  • Python3
  • フラスコ
  • 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回目のインタラクションで止まっていることがわかりました。

シェルスクリプトで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)

誰かがすでにこの問題を解決しているか、フラスコで動作する sqlite3 の代替案を教えてくれるかもしれません。

4

1 に答える 1