On Sun, Jan 19, 2020, at 11:10 AM, Mike Bayer wrote:
> 
> 
> 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.

OK well looking at https://postgis.net/docs/ST_AsGeoJSON.html it says "Return 
the geometry as a GeoJSON "geometry" object, or the row as a GeoJSON "feature" 
object", even though the signatures say "text". OK so I see you want to change 
the type based on the arguments. It's safe to do that in your constructor as 
well; "if this_looks_like_a_row(args): self.type = Feature else: 
self.type=Geometry".



> 
> 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/f611d0bd-ff93-46e2-802f-b5f097c5723c%40www.fastmail.com.

Reply via email to