Nodes/Nova Audio Player/Nova SQLite Single Row Filter ๐Ÿ”
ComfyUI Node

Nova SQLite Single Row Filter ๐Ÿ”

One Row Out, No Loop Attached

By NovaFemmeยทCreated 2 months agoยทUpdated 12 days agoยท 1
Nova SQLite Single Row Filter ๐Ÿ”
  • row_data_json
  • single_row_json
  • row_index
  • total_rows
  • col_0
  • col_1
  • col_2
  • col_3
  • col_4
  • col_5
  • col_6
  • col_7
  • col_8
  • col_9
  • col_10
  • col_11
  • col_12
  • col_13
  • col_14
  • col_15
  • col_16
  • col_17
  • col_18
  • col_19
  • col_20
  • col_21
  • col_22
  • col_23
  • col_24
  • col_25
  • col_26
  • col_27
  • col_28
  • col_29
  • col_30
  • col_31
  • col_32
  • col_33
  • col_34
  • col_35
  • col_36
  • col_37
  • col_38
  • col_39
  • col_40
  • col_41
  • col_42
  • col_43
  • col_44
  • col_45
  • col_46
  • col_47
  • col_48
  • col_49
  • col_50
  • col_51
  • col_52
  • col_53
  • col_54
  • col_55
  • col_56
  • col_57
  • col_58
  • col_59
  • col_60
  • col_61
  • col_62
  • col_63
โ—„row_index0โ–บ

The pack ships three SQLite nodes and two of them look nearly identical on the canvas. This is the quiet one: Nova SQLite Single Row Filter ๐Ÿ” takes the same rows the iterator takes, but it picks one row, hands out its columns, and stops. No queueing, no loop state, no runaway runs at 3am.

Reach for it when the job is "that track" rather than "every track". Re-tagging one file from its row in the release manifest. Fixing a single bad prompt and re-rendering exactly that one. Checking what a row actually contains before you commit a hundred of them to the iterator.

How it behaves

It's the same row engine as the iterator with the loop machinery removed. You give it row_data_json - from Nova Dynamic SQLite Browser ๐Ÿ“ - and a row_index, and it isolates that row, stringifies every value, and emits them as col_0, col_1, โ€ฆ named after your real columns. The node renders the row on the canvas too, so you can see the values you're about to wire somewhere.

Two behaviours are worth knowing before they surprise you.

The first is the row lock. Its row_index tooltip says it plainly: "Row to show (0-based). Ignored when only one row is received." If the upstream query returns exactly one row, the selector goes inert and that row is emitted regardless of what index you typed. Which is the correct call - there's exactly one answer - but it means a graph that behaves one way against your test table behaves differently against a one-row table.

The second is that the column outputs come from the browser's ticked column badges, same as the iterator. Tick two columns upstream and you get two usable outputs. Tick none and the node fails with "0 columns selected: select at least one column badge on the SQLite Browser" - clear, but it's an error raised on a node that looks perfectly wired.

Inputs and outputs

Only two inputs, both required, and you'll set one:

  • row_data_json - the row list from the browser. Force-input; nothing else produces this pink NOVA_SQLITE_ROWS link.
  • row_index - 0-based row to isolate.

Outputs: single_row_json (the whole row as a JSON object - genuinely handy to dump into a Nova Console ๐Ÿ–ฅ๏ธ so you can read what came back, or to feed a node that takes a JSON string), row_index and total_rows for logging, and the col_0 โ€ฆ col_63 column slots.

Wire the column outputs exactly as you would with the iterator: filename to your save node's name, prompt to the text encoder, bit depth to the FLAC writer. The difference is only in how many times it happens.

Install

Through the ComfyUI Manager, search ComfyUI-NovaAudioPlayer; or by hand, then restart:

cd ComfyUI/custom_nodes
git clone https://github.com/NovaFemme/ComfyUI-NovaAudioPlayer.git

The node lands under โ–ถ๏ธ Nova Audio โ†’ ๐Ÿ“ฆ Delivery & Metadata. Nothing extra to install: this trio is pure standard library sqlite3. The pack's mutagen and pymysql requirements belong to its tag-writing and MySQL nodes and are imported lazily, so cloning straight into custom_nodes won't take the menu down. For a first run with data in it, drop the bundled example table where the browser can find it:

cp ComfyUI/custom_nodes/ComfyUI-NovaAudioPlayer/examples/nova_album_example.db ComfyUI/input/album_data.db

Failure modes, all of them loud

This node fails in words rather than silently emitting blanks, which is the right design for plumbing and also means the console tells you exactly what's wrong:

  • row_index 7 is out of range (valid: 0 - 5) - you typed an index past the end. Note it prints the valid range, because 0-based indexing is where everyone's first guess lands wrong.
  • No rows: the table is empty or the query failed (check the browser node) - the upstream browser returned [], usually because the database or table wasn't selected.
  • row_data_json is not valid JSON - something other than the browser is feeding this input.
  • Row 3 is not an object - the input was a JSON array of non-objects, which in practice means hand-written JSON.

One structural caveat rather than a failure: only the first 64 columns are emitted, with a warning on the node if the row is wider. That's a big row by any measure, but if you're pointing this at a wide database table, know the cap exists.

And the choice between the two siblings, in one line: if you're rendering or tagging more than one thing, use Nova SQLite Row Iterator & Splitter ๐Ÿ“ฆ; if you want one row and zero side effects, this node exists so you don't have to arm a loop and then babysit Cancel.

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

Inputs (2)

NameTypeDefaultDescription
row_data_jsonNOVA_SQLITE_ROWSRows from Nova Dynamic SQLite Browser or Nova SQLite Data Table & Filter.
row_indexINT00โ€“999999Row to show (0-based). Ignored when only one row is received.

Outputs (67)

NameTypeDescription
single_row_jsonSTRINGโ€”
row_indexINTโ€”
total_rowsINTโ€”
col_0STRINGโ€”
col_1STRINGโ€”
col_2STRINGโ€”
col_3STRINGโ€”
col_4STRINGโ€”
col_5STRINGโ€”
col_6STRINGโ€”
col_7STRINGโ€”
col_8STRINGโ€”
col_9STRINGโ€”
col_10STRINGโ€”
col_11STRINGโ€”
col_12STRINGโ€”
col_13STRINGโ€”
col_14STRINGโ€”
col_15STRINGโ€”
col_16STRINGโ€”
col_17STRINGโ€”
col_18STRINGโ€”
col_19STRINGโ€”
col_20STRINGโ€”
col_21STRINGโ€”
col_22STRINGโ€”
col_23STRINGโ€”
col_24STRINGโ€”
col_25STRINGโ€”
col_26STRINGโ€”
col_27STRINGโ€”
col_28STRINGโ€”
col_29STRINGโ€”
col_30STRINGโ€”
col_31STRINGโ€”
col_32STRINGโ€”
col_33STRINGโ€”
col_34STRINGโ€”
col_35STRINGโ€”
col_36STRINGโ€”
col_37STRINGโ€”
col_38STRINGโ€”
col_39STRINGโ€”
col_40STRINGโ€”
col_41STRINGโ€”
col_42STRINGโ€”
col_43STRINGโ€”
col_44STRINGโ€”
col_45STRINGโ€”
col_46STRINGโ€”
col_47STRINGโ€”
col_48STRINGโ€”
col_49STRINGโ€”
col_50STRINGโ€”
col_51STRINGโ€”
col_52STRINGโ€”
col_53STRINGโ€”
col_54STRINGโ€”
col_55STRINGโ€”
col_56STRINGโ€”
col_57STRINGโ€”
col_58STRINGโ€”
col_59STRINGโ€”
col_60STRINGโ€”
col_61STRINGโ€”
col_62STRINGโ€”
col_63STRINGโ€”