erikdarlingdata / duckdb
Query the Lite app's DuckDB database safely while the collector is running
Query Lite's DuckDB Database
Safely query the PerformanceMonitor Lite DuckDB database using Python. This skill exists because DuckDB only allows one read-write connection at a time. When Lite is running (collecting data), it holds the write connection. External readers MUST connect in read-only mode.
Database Location
Since the #1832 fix (data moved OUT of Velopack's install root, which Setup.exe deletes), the store lives at:
%LOCALAPPDATA%\PerformanceMonitorLite-Data\monitor.duckdbBuilds from BEFORE that fix (3.3.0 and earlier) keep it at the old path, and the file only moves when a fixed build first runs:
%LOCALAPPDATA%\PerformanceMonitorLite\monitor.duckdbCheck the -Data path first; fall back to the old path if it does not exist.
How to Query (ALWAYS use this pattern)
Use Python with the duckdb module. ALWAYS connect in read-only mode.
python -c "
import duckdb, os
la = os.environ['LOCALAPPDATA']
p = la + '/PerformanceMonitorLite-Data/monitor.duckdb'
if not os.path.exists(p):
p = la + '/PerformanceMonitorLite/monitor.duckdb'
con = duckdb.connect(p, read_only=True)
result = con.execute('YOUR SQL HERE').fetchall()
for row in result:
print(row)
con.close()
"CRITICAL RULES
- ALWAYS use
read_only=True-- without this, the connection will be blocked by Lite's write lock and hang or fail - NEVER use
duckdb.connect()withoutread_only=True-- the default is read-write which WILL conflict with the running app - Use forward slashes in the path (Python on Windows handles this fine)
- Close the connection when done -- don't leave read locks dangling
- Use Python -- duckdb 1.4.4 is installed
Common Queries
List all tables:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'main' ORDER BY table_name;List columns for a table:
SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'TABLE_NAME' ORDER BY ordinal_position;List all views:
SELECT table_name FROM information_schema.tables WHERE table_type = 'VIEW' ORDER BY table_name;Row counts:
SELECT table_name, estimated_size FROM duckdb_tables() ORDER BY estimated_size DESC;DuckDB vs SQL Server Syntax Notes
- String concatenation:
||(not+) - ILIKE for case-insensitive LIKE
EPOCH_MS(timestamp_col)to convert to epochstrftime('%Y-%m-%d %H:%M:%S', ts)for formatting- No
TOP N-- useLIMIT Ninstead EXCLUDEclause:SELECT * EXCLUDE (col1, col2) FROM table