← All posts

By Speedy ·August 4, 2026 · updated August 4, 2026· 2 min read

New query_denodo utility!

securitypython

Querying Denodo the right way

If you've ever pointed a script at Denodo's Data Catalog API expecting row data back, you've hit the same wall we did: it's a metadata catalog. It'll happily tell you what databases and views exist, but it has no endpoint that returns actual rows. The real data lives behind a completely different, easy-to-miss service — denodo-restfulws — and until you know that, "query my Denodo view over REST" is a surprisingly hard thing to Google your way into.

query_denodo is a small CLI that targets the correct endpoint from the start, so you don't have to rediscover that distinction yourself.

What it does

Point it at a published view and get rows back, streamed, in whatever shape your next step needs:

python qd.py \
  --url https://denodo.example.com:9090/denodo-restfulws/mydb/views/customers \
  --username vdp_user --password vdp_pass
{"customer_id": 1, "name": "Acme Corp", "region": "EMEA"}
{"customer_id": 2, "name": "Globex", "region": "AMER"}

It's also included in the query-bench container. Check it out here: https://ownjoo.org/docker/#query-bench

Why it's worth reaching for

  • Targets the real data API. denodo-restfulws, not the Data Catalog — confirmed against Denodo's own docs and a real deployment, not guessed.
  • Handles pagination for you. Denodo's $start_index/$count paging, $format=json, and the elements response wrapper are all internal — you just get a stream of records.
  • Output that fits your pipeline. jsonl for piping to jq, csv for spreadsheets, a formatted table for humans, or a proper JSON file — pick with --output.
  • Built on the same foundation as the rest of the ownjoo.org query_ family*: httpx for transport, oj-toolkit for parsing/logging/output, retry-async for backoff. If you've used one of these tools, you already know how this one works.
  • Self-signed / internal deployments covered--insecure skips TLS verification when you're pointed at a non-public Denodo instance.
  • Sample and go. --limit caps how many records you pull, so you can eyeball a view's shape before committing to a full export.

Try it

git clone https://github.com/ownjoo/query_denodo.git
cd query_denodo
pip install -r requirements.txt
python qd.py --url <your-view-url> --username <user> --password <pass> --output table

Full README, source, and CI status: ownjoo.org/projects/?repo=query_denodo

// about the author

Speedy