We use an SQLite database to save sensor readings so we can keep track of data over time. It helps us organize and find sensor information easily.
SQLite database for sensor data in Raspberry Pi
import sqlite3 # Connect to database (creates file if not exists) conn = sqlite3.connect('sensor_data.db') cursor = conn.cursor() # Create table for sensor readings cursor.execute(''' CREATE TABLE IF NOT EXISTS readings ( id INTEGER PRIMARY KEY AUTOINCREMENT, sensor_name TEXT NOT NULL, value REAL NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ) ''') # Insert a sensor reading cursor.execute('INSERT INTO readings (sensor_name, value) VALUES (?, ?)', ('temperature', 23.5)) conn.commit() # Query data cursor.execute('SELECT * FROM readings') rows = cursor.fetchall() # Close connection conn.close()
Use sqlite3.connect() to open or create the database file.
Use cursor.execute() to run SQL commands like creating tables or inserting data.
readings if it does not exist yet.cursor.execute('CREATE TABLE IF NOT EXISTS readings (id INTEGER PRIMARY KEY, sensor_name TEXT, value REAL, timestamp DATETIME)')cursor.execute('INSERT INTO readings (sensor_name, value) VALUES (?, ?)', ('humidity', 45.2))
cursor.execute('SELECT * FROM readings WHERE sensor_name = ?', ('temperature',)) rows = cursor.fetchall()
This program creates a database and table, inserts three temperature readings with a pause between them, then prints all stored readings with their timestamps.
import sqlite3 import time # Connect to SQLite database file conn = sqlite3.connect('sensor_data.db') cursor = conn.cursor() # Create table if not exists cursor.execute(''' CREATE TABLE IF NOT EXISTS readings ( id INTEGER PRIMARY KEY AUTOINCREMENT, sensor_name TEXT NOT NULL, value REAL NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ) ''') # Simulate inserting 3 temperature readings for temp in [22.4, 22.8, 23.1]: cursor.execute('INSERT INTO readings (sensor_name, value) VALUES (?, ?)', ('temperature', temp)) conn.commit() time.sleep(1) # wait 1 second to get different timestamps # Retrieve and print all readings cursor.execute('SELECT id, sensor_name, value, timestamp FROM readings') rows = cursor.fetchall() for row in rows: print(f'ID: {row[0]}, Sensor: {row[1]}, Value: {row[2]}, Time: {row[3]}') # Close connection conn.close()
SQLite stores the database in a single file, making it easy to move or backup.
Always call conn.commit() after inserting or changing data to save it.
Use DEFAULT CURRENT_TIMESTAMP to automatically save the time when data is added.
SQLite helps save sensor data on Raspberry Pi without extra setup.
Create tables to organize sensor readings with columns for name, value, and time.
Insert and query data easily using Python's sqlite3 module.
Practice
Solution
Step 1: Understand SQLite's role on Raspberry Pi
SQLite is a lightweight database that runs locally without needing a separate server.Step 2: Connect SQLite to sensor data storage
It stores sensor readings on the Raspberry Pi itself, making data management easy and offline.Final Answer:
To store sensor readings locally without needing a separate database server -> Option CQuick Check:
SQLite stores data locally = B [OK]
- Confusing SQLite with cloud services
- Thinking SQLite controls hardware
- Assuming SQLite automatically displays data
sensors with columns id (integer primary key), name (text), and value (real)?Solution
Step 1: Check SQL syntax for table creation
The correct SQL command is CREATE TABLE followed by table name and column definitions in parentheses.Step 2: Match Python sqlite3 syntax
Python uses cursor.execute() with a valid SQL string. cursor.execute('CREATE TABLE sensors (id INTEGER PRIMARY KEY, name TEXT, value REAL)') matches correct SQL and Python syntax.Final Answer:
cursor.execute('CREATE TABLE sensors (id INTEGER PRIMARY KEY, name TEXT, value REAL)') -> Option AQuick Check:
Correct SQL CREATE TABLE syntax = D [OK]
- Using wrong SQL keywords like MAKE TABLE
- Incorrect column types like STRING instead of TEXT
- Missing parentheses around columns
import sqlite3
conn = sqlite3.connect('data.db')
cursor = conn.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS sensors (name TEXT, value REAL)')
cursor.execute("INSERT INTO sensors VALUES ('temp', 23.5)")
cursor.execute('SELECT * FROM sensors')
rows = cursor.fetchall()
print(rows)What will be the output?
Solution
Step 1: Understand table creation and insertion
The table 'sensors' is created if not exists, then a row ('temp', 23.5) is inserted.Step 2: Fetch all rows and print
The SELECT query fetches all rows, which includes the inserted row, so print outputs [('temp', 23.5)].Final Answer:
[('temp', 23.5)] -> Option AQuick Check:
Inserted row fetched = [('temp', 23.5)] [OK]
- Forgetting to insert data before SELECT
- Expecting empty list if table exists
- Confusing fetchall() output format
cursor.execute('CREATE TABLE sensors (name TEXT, value REAL)')
cursor.execute('INSERT INTO sensors (name, value) VALUES (?, ?)', ('humidity'))
conn.commit()What is the error and how to fix it?
Solution
Step 1: Identify parameter mismatch in INSERT
The VALUES clause expects two values, but only one ('humidity') is given as a tuple missing a second element.Step 2: Fix by providing both values
Provide a tuple with two elements, e.g., ('humidity', 45.0), to match the two columns.Final Answer:
Error: Missing second value in tuple; fix by adding a second value like ('humidity', 45.0) -> Option BQuick Check:
Parameter count matches columns = C [OK]
- Passing single string instead of tuple with two values
- Ignoring commit() after insert
- Wrong SQL syntax in INSERT statement
Solution
Step 1: Choose correct table schema for timestamp
Use TEXT type for time column to store datetime strings, which SQLite supports well.Step 2: Insert current local time correctly
Use SQLite function datetime('now', 'localtime') to get current local timestamp as text.Step 3: Match insertion code with schema
CREATE TABLE readings (name TEXT, value REAL, time TEXT); cursor.execute("INSERT INTO readings VALUES ('temp', 22.1, datetime('now', 'localtime'))") uses TEXT time column and inserts with datetime('now', 'localtime'), which is correct.Final Answer:
CREATE TABLE readings (name TEXT, value REAL, time TEXT); cursor.execute("INSERT INTO readings VALUES ('temp', 22.1, datetime('now', 'localtime'))") -> Option DQuick Check:
Local timestamp stored as TEXT = A [OK]
- Using CURRENT_TIMESTAMP without quotes in Python
- Storing time as INTEGER without conversion
- Ignoring localtime adjustment for timestamps
Ready to prove it?
Pass the test and this pattern moves unknown
