Returning Postgres JSON view as JSON string without serialization

206 views
Skip to first unread message

Stephan Hügel

unread,
Oct 29, 2021, 7:52:37 PM10/29/21
to sqlalchemy
I’m querying a Postgres view which returns JSON (SELECT json_build_object(…)) which I’ve declared as a view in my db:

allinfra = Table("allinfra", db.metadata, autoload_with=db.engine)
res = db.session.query(allinfra).scalar()

But this gives me a Python dict, when what I want is the JSON string returned by the view - serializing it with json.dumps() on the Python side defeats the point (getting Postgres to do the heavy lifting). Apologies if this question has an obvious answer, but I’ve found it impossible to search for.

Mike Bayer

unread,
Oct 29, 2021, 9:17:01 PM10/29/21
to noreply-spamdigest via sqlalchemy
psycopg2 driver (if that's what you're using) jumps in to do the JSON so if you dont want json you need to cast as a string, like cast(table.c.json_col, String).

if you are using a Table with autoload you'd want to override this type using the technique detailed at https://docs.sqlalchemy.org/en/14/core/reflection.html#overriding-reflected-columns .
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
 
 
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups "sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+...@googlegroups.com.

Mike Bayer

unread,
Oct 29, 2021, 9:17:49 PM10/29/21
to noreply-spamdigest via sqlalchemy
oh also, if this is a view, much easier, just put the CAST to TEXT in your CREATE VIEW statement.  that way you will definitely get strings back and nothing json related will kick in client side.

Stephan Hügel

unread,
Oct 30, 2021, 10:56:12 AM10/30/21
to sqlalchemy
Thanks Mike, wrapping the view declaration with ()::TEXT worked perfectly, but good to know I can do it from SQLA at load time if need be.
Reply all
Reply to author
Forward
0 new messages