Nova Dynamic SQLite Browser ๐
Stop Retyping the Same Forty Prompts
- row_data_json
- column_names_list
- column_names_json
- column_count
- row_count
- table
If your workflow has one text box with forty prompts in it, you have already met the wall this node exists for. You edit line 12, re-run from the top, and now you are tracking which rows you already did in your head. The usual community answer is an INT counter feeding a PromptLine node from Easy-Use - that's the top reply when someone asks how to generate hundreds of images overnight, and it works fine right up to the moment each item needs more than one field.
A music release is the obvious case. Every track has a title, a prompt, lyrics, a BPM, a key, a target bit depth, and a filename that has to match the file you're about to write. That isn't a text box, that's a table. Nova Dynamic SQLite Browser ๐ is the front of that workflow: point it at a SQLite file, tick the columns you care about, and hand the rows downstream.
What it is, in context
This is one of twenty-five nodes in NovaFemme's Nova Audio Player pack, which exists to make music with ACE-Step, and the SQLite trio sits under ๐ฆ Delivery & Metadata - the part of the graph that decides what a finished track is called, what metadata rides on it, and which take is which. It's plumbing in the purest sense: it touches no audio, and it's the kind of node that never gets written about because everything interesting happens three nodes downstream.
The pack ships an example so you aren't guessing: examples/nova_album_example.db, an albums table with one row per track - filename, duration, title, artist, album, genre, prompt, lyrics, bpm, key, ISRC, bit depth, sample rate. That's a release manifest, and it tells you what the node is for.
How it works
At graph load, the backend lists every .db, .sqlite and .sqlite3 file in ComfyUI's input folder and offers them in the database_path combo. Nothing outside that folder is scanned, which is the single most important thing to know about this node.
table_name is a combo whose default list is the union of tables across every database it found - a convenience that makes the node feel populated instead of empty. Once you pick a database, the frontend posts to the pack's own /sqlite_browser/get_tables and /sqlite_browser/get_columns endpoints to refill both combos with the real schema. Columns render as clickable badges rather than a list you type into, and the badges write the hidden selected_columns widget as a JSON list.
Execution then runs SELECT "a", "b" ... FROM "table" with identifiers quoted, no WHERE, no LIMIT, and no ORDER BY, and dumps the result as a JSON array of row objects. The whole table goes through memory. Missing column names are dropped with a note rather than an error; BLOBs become the literal string <BLOB 4096 bytes>; NULLs stay null in the JSON.
The inputs and outputs that matter
Three inputs, and honestly you set one of them:
database_path- put your.dbinComfyUI/input/and pick it here. The resolver accepts an absolute path too, so an upstream STRING node can point it anywhere if you convert the widget to an input.table_name- the table to pull from. If the combo shows a table that belongs to a different file, you'll get a cleanTable 'x' not foundinstead of a stack trace.selected_columns- hidden in the UI; the badges drive it. Empty,*, or nothing ticked all mean "no columns".
Five outputs. row_data_json is the one that matters - it feeds the other two nodes in this trio, and the pink NOVA_SQLITE_ROWS link colour makes that obvious. column_names_list, column_names_json, column_count and row_count are for logging and for anything you want to compute off the shape of the query.
Install
From the Comfy Registry:
comfy node install comfyui-novaaudioplayer
Or clone it and restart ComfyUI:
cd ComfyUI/custom_nodes
git clone https://github.com/NovaFemme/ComfyUI-NovaAudioPlayer.git
These three SQLite nodes need nothing extra - sqlite3 is Python standard library. The pack declares mutagen and pymysql for its tag and MySQL nodes, and imports them lazily, so a bare clone loads the whole menu fine. Then:
cp ComfyUI/custom_nodes/ComfyUI-NovaAudioPlayer/examples/nova_album_example.db ComfyUI/input/album_data.db
The shipped workflow (example_workflows/Delivery & Metadata/Nova Dynamic SQLite Browser Nodes Workflow.json) expects a database called album_data.db in the input folder, so that copy gives you a zero-edit first run.
Where people get burned
The most common one by a mile: your database isn't in ComfyUI/input/, so the combo shows (no database in input folder) and the node reports "No database selected". Drop the file in, then reload the workflow or restart - the file list is built when the graph loads.
Next: row_count comes back with all the rows and column_count is 0, status line reading "N rows ยท 0 columns selected". That's not a bug, that's you not having clicked a column badge yet. The row list is deliberately still returned so the downstream iterator can tell you exactly what went wrong.
And one to plan around: there's no WHERE clause here. This node reads a whole table, every time, and JSON-serializes all of it on every queue. The pack's older, now-deprecated Nova SQLite Reader ๐๏ธ is the one with a where box and a columns string - if your job is "filter this 900k-row log", that's the node, deprecated or not. For a few hundred rows of track metadata, the browser is the one you'll actually keep on the canvas.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| database_path | COMBO | (no database in input folder) | A SQLite database inside ComfyUI's input folder, sub-folders included. Copy the file there, then press the refresh button on the node. |
| table_name | COMBO | The table to read. The list follows the database chosen above. | |
| selected_columns | STRING | Set by the column chips on the node: the columns to output, as a JSON list. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| row_data_json | NOVA_SQLITE_ROWS | Rows for the Data Table, Row Iterator and Single Row nodes. |
| column_names_list | LIST | The selected column names. |
| column_names_json | STRING | The selected column names as JSON. |
| column_count | INT | How many columns are selected. |
| row_count | INT | How many rows the table holds. |
| table | NOVA_TABLE | The same rows as a NOVA_TABLE, for Nova Tag Writer and the other pack nodes. |