On Sun, Jan 19, 2020, at 10:54 AM, Stephan Hügel wrote:
> I'm trying to define a GenericFunction that calls a PostGIS 3.0 function 
> (ST_AsGeoJson <https://postgis.net/docs/ST_AsGeoJSON.html>). The latest 
> version can be called in two different ways:
> 
> SELECT ST_AsGeoJSON(t.geom) FROM foo as t WHERE t.id = 1;
> SELECT ST_AsGeoJSON(t.*) FROM foo as t WHERE t.id = 1;
> 
> where the first example returns a GeoJSON Geometry, and the second returns a 
> GeoJSON Feature. I'm only interested in making use of the second type / am 
> happy to define the two variants separately.
> 
> I should be able to subclass GenericFunction in order to do this, but I'm 
> missing two details:
> 
> 1. What should the return type of my subclass be?
> 2. How can I specify that I want to pass the record / row / all columns, as 
> opposed to just the geom column to the underlying function? Ordinarily, 
> attempting something like 
> 
> sess.query(func.MyGeojson(Foo)).all()
> 
> Will give me an error:
> 
> Object <class 'models.Foo'> is not legal as a SQL literal value



by "return type" I think you're referring to the "type" attribute, so in SQL if 
you were to make a database column that stores the result of the ST_AsGeoJSON 
function, a quick google shows it as "text", so for SQLAlchemy you could make 
the return type String, VARCHAR, TEXT, etc.

for the column expansion you override the constructor and inspect the object(s) 
given and do what you want with them. SQLAlchemy has some built-in systems for 
"how to expand an ORM model or Selectable into Table columns" but only in 1.4 
is there a new system for this that is organized and predictable, so for the 
moment you'd want to roll it yourself:

from sqlalchemy import inspect

class MyFunction(GenericFunction):
 def __init__(self, *args, **kw):
 pass_args = []
 for arg in args:
 insp = inspect(arg)
 if hasattr(insp, "selectable"):
 pass_args.extend(selectable.c.)
 else:
 pass_args.append(arg)
 super(MyFunction, self).__init__(*pass_args, **kw)

also note there's been a lot of call for Geo support lately (not sure if you 
were the person that filed an issue re: SQL Server) but we are really looking 
for help to get geoalchemy2 up to date and supporting more backends.



> 

> 

> 

> --
>  SQLAlchemy - 
>  The Python SQL Toolkit and Object Relational Mapper
> 
> http://www.sqlalchemy.org/
> 
>  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+unsubscr...@googlegroups.com.
>  To view this discussion on the web visit 
> https://groups.google.com/d/msgid/sqlalchemy/f3718ff7-a252-41a9-8ac4-1ee2ee1e7f9f%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/sqlalchemy/f3718ff7-a252-41a9-8ac4-1ee2ee1e7f9f%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

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+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/541d726a-4652-4186-bd70-9f76241e6a20%40www.fastmail.com.

Reply via email to