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.