Nodes/Nova Audio Player/Nova Dynamic SQLite Browser ๐Ÿ“
ComfyUI Node

Nova Dynamic SQLite Browser ๐Ÿ“

Stop Retyping the Same Forty Prompts

By NovaFemmeยทCreated 2 months agoยทUpdated 12 days agoยท 1
Nova Dynamic SQLite Browser ๐Ÿ“
    • row_data_json
    • column_names_list
    • column_names_json
    • column_count
    • row_count
    • table
    โ—„database_path(no database in input folder)โ–บ
    โ—„table_nameโ–บ
    โ—„selected_columnsโ–บ

    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 .db in ComfyUI/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 clean Table 'x' not found instead 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.

    Categoryโ–ถ๏ธ Nova Audio/๐Ÿ“ฆ Delivery & Metadata

    Inputs (3)

    NameTypeDefaultDescription
    database_pathCOMBO(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_nameCOMBOThe table to read. The list follows the database chosen above.
    selected_columnsSTRINGSet by the column chips on the node: the columns to output, as a JSON list.

    Outputs (6)

    NameTypeDescription
    row_data_jsonNOVA_SQLITE_ROWSRows for the Data Table, Row Iterator and Single Row nodes.
    column_names_listLISTThe selected column names.
    column_names_jsonSTRINGThe selected column names as JSON.
    column_countINTHow many columns are selected.
    row_countINTHow many rows the table holds.
    tableNOVA_TABLEThe same rows as a NOVA_TABLE, for Nova Tag Writer and the other pack nodes.