working on this now, just a quick question, is there an actual difference between
select([func.ST_AsGeoJSON(Lake.__table__.c.geom)]) and select([func.ST_AsGeoJSON(Lake, 'geom')]) ? that is, users definitely need this goofy "Table" syntax, right? On Wed, Apr 15, 2020, at 7:15 AM, Adrien Berchet wrote: > Ok, thank you for your advice, following it I tried the following (in > geoalchemy2.functions.py). >> *class* ST_AsGeoJSON(functions.GenericFunction): *def* __init__(self, *args, **kwargs): args = list(args) self.feature_mode = False *for* idx, elem *in* enumerate(args): *try*: insp = inspect(elem) *if* hasattr(insp, "selectable"): args[idx] = insp.selectable self.feature_mode = True *except* Exception: *continue* functions.GenericFunction.__init__(self, *args, **kwargs) >> *def* _compile_ST_AsGeoJSON(cls): *def* _compile_geojson_feature(cls_name, element, compiler, **kw): *if* *not* element.feature_mode: *return* "{}({})".format(cls_name, compiler.process(element.clauses, **kw)) *else*: clauses = list(element.clauses) table = compiler.process(clauses[0], asfrom=True, **kw).split(".")[-1] # This is quite dirty args = [] *if* len(clauses) > 1: args = ", ".join([compiler.process(i, **kw) *for* i *in* clauses[1:]]) *return* "{}({})".format(cls_name, ", ".join([table, args])) *def* _compile_geojson_default(element, compiler, **kw): *return* _compile_geojson_feature(cls, element, compiler, **kw) *def* _compile_geojson_sqlite(element, compiler, **kw): *return* _compile_geojson_feature(cls[3:], element, compiler, **kw) compiles(globals()[cls])(_compile_geojson_default) compiles(globals()[cls], "sqlite")(_compile_geojson_sqlite) _compile_ST_AsGeoJSON("ST_AsGeoJSON") >> > I am not sure it is the right way to do it but using this it is possible to > write the following queries: > 1. select([func.ST_AsGeoJSON(Lake.__table__.c.geom)]) > 2. select([func.ST_AsGeoJSON(Lake, 'geom')]) > But it does not work for subqueries: > sq = select([Lake, bindparam('dummy_val', 10).label('dummy_attr')]).alias() select([func.ST_AsGeoJSON(sq, 'geom')]) > because the generated query is: >> [SELECT ST_AsGeoJSON(lake) *AS* anon_1, %(ST_AsGeoJSON_2)s) *AS* >> "ST_AsGeoJSON_1" >> *FROM* (SELECT gis.lake.id *AS* id, gis.lake.geom *AS* geom, %(dummy_val)s >> *AS* dummy_attr >> *FROM* gis.lake) *AS* anon_1] >> [parameters: {'dummy_val': 10, 'ST_AsGeoJSON_2': 'geom'}] > How can I get the alias of an aliased selectable? > > > Le mar. 14 avr. 2020 à 18:33, Mike Bayer <mike...@zzzcomputing.com> a écrit : >> __ >> OK so use the "t" form with the "geom" name sent as a string, it wants the >> whole row so this is a special Postgresql syntax. There are many ways to >> make it output this and it depends on the specifics of how this is being >> rendered. it may require a custom construct with a @compiles rule as I would >> assume it needs to respond to things like table alias names, subquery alias >> names, etc. >> >> >> >> >> >> >> On Tue, Apr 14, 2020, at 10:28 AM, Adrien Berchet wrote: >>> This function is defined here: >>> https://github.com/postgis/postgis/blob/7f4426716f561187175d73bfff330343b25a7be9/postgis/postgis.sql.in#L4609 >>> And its C implementation is here: >>> https://github.com/postgis/postgis/blob/b48fb3e2272568aa6310fc26aefc69010d4f37e3/postgis/lwgeom_out_geojson.c#L79 >>> >>> Its first argument is a record and the second one (optional) is the name of >>> the geometry column. If the second argument is not given, it iterates over >>> all attributes of this record, pick the first geometry attribute to convert >>> it to a GeoJSON Geometry and all over attributes are set as properties in >>> the generated GeoJSON. >>> The only two ways I found to use this function are the following: >>> 1. SELECT ST_AsGeoJson(t.*, 'geom') -- The 'geom' argument is optional here >>> FROM (SELECT 1 AS id, ST_GeomFromText('POINT( 1 1)') AS geom) AS t; >>> 2. SELECT ST_AsGeoJson(t, 'geom') -- The 'geom' argument is optional here >>> FROM (SELECT 1 AS id, ST_GeomFromText('POINT( 1 1)') AS geom) AS t; >>> If we want to convert only a subset of columns into GeoJson properties we >>> have to use a subquery to select this subset, it is not possible (as far as >>> I can see) to pass the subset to the function. The only way I found to pass >>> a subset is using the ROW() function but then the GeoJson properties have >>> dummy names ('f1', 'f2', ...). >>> >>> Le mar. 14 avr. 2020 à 15:57, Mike Bayer <mike...@zzzcomputing.com> a écrit >>> : >>>> __ >>>> does this ST_AsGeoJSON function hardcode itself to look for column names >>>> "id" and "geom" ? it's not going to be any easier to get SQLAlchemy to >>>> render "t" than it is "t.*". it wants to name columns. >>>> >>>> >>>> >>>> On Tue, Apr 14, 2020, at 9:45 AM, Adrien Berchet wrote: >>>>> I just found that in fact it is possible to just pass the table name to >>>>> ST_AsGeoJson, so the following query works: >>>>>> SELECT ST_AsGeoJSON(t) >>>>>> FROM t; >>>>> >>>>> I will try to use this writing in GeoAlchemy2, though I don't know yet >>>>> how to translate it in SQLAlchemy. >>>>> >>>>> Le mar. 14 avr. 2020 à 14:23, Mike Bayer <mike...@zzzcomputing.com> a >>>>> écrit : >>>>>> __ >>>>>> and you can't say "SELECT t.d, t.geom" ? There really should be no >>>>>> difference between "t.*" and "t.id, t.geom". >>>>>> >>>>>> >>>>>> >>>>>> On Tue, Apr 14, 2020, at 5:31 AM, Adrien Berchet wrote: >>>>>>> The "column names" issue is that when we use ROW(), like in the >>>>>>> following query: >>>>>>>> SELECT ROW(t.id, t.geom) >>>>>>>> FROM (SELECT 1 AS id, ST_GeomFromText('POINT( 1 1)') AS geom) AS t; >>>>>>> we obtain the following result: >>>>>>>> row >>>>>>>> ------------------------------------------------ >>>>>>>> (1,0101000000000000000000F03F000000000000F03F) >>>>>>> in which the initial column names ('id' and 'geom') are lost. So when >>>>>>> we give this result to the ST_AsGeoJson() function, it can not retrieve >>>>>>> these names for the property names so it just replaces them by 'f1', >>>>>>> 'f2', ... >>>>>>> >>>>>>> And I can't find any way to pass the names to the ROW() constructor: >>>>>>> https://www.postgresql.org/docs/current/sql-expressions.html#SQL-SYNTAX-ROW-CONSTRUCTORS >>>>>>> >>>>>>> >>>>>>> Le mardi 14 avril 2020 00:47:28 UTC+2, Mike Bayer a écrit : >>>>>>>> >>>>>>>> >>>>>>>> On Mon, Apr 13, 2020, at 6:25 PM, Adrien Berchet wrote: >>>>>>>>> Hello there >>>>>>>>> >>>>>>>>> I tried to integrate your POC in GeoAlchemy2 in the following PR: >>>>>>>>> https://github.com/geoalchemy/geoalchemy2/pull/258 >>>>>>>>> >>>>>>>>> It is almost working but the ST_AsGeoJSON() function needs a record, >>>>>>>>> not a list of columns. So the query should be like: >>>>>>>>>> SELECT ST_AsGeoJSON(t.*) FROM t; >>>>>>>>> while the example you provided gives: >>>>>>>>>> SELECT ST_AsGeoJSON(t.id, t.geom) FROM t; >>>>>>>>> which is not accepted by PostGIS (Error: the function >>>>>>>>> st_asgeojson(integer, geometry) does not exist). >>>>>>>>> >>>>>>>>> I was able to make it work in the PR by adding a call to the ROW() >>>>>>>>> function, which leads to the following query: >>>>>>>>>> SELECT ST_AsGeoJSON(ROW(t.id, t.geom)) FROM t; >>>>>>>>> This query is properly executed by PostGIS but the column names are >>>>>>>>> lost. For example I will get the following result: >>>>>>>>>> {"type": "Feature", "geometry": >>>>>>>>>> {"type":"Point","coordinates":[1,1]}, "properties": {*"f1"*: 1}} => >>>>>>>>>> "f1" property should be name "id" >>>>>>>>> instead of: >>>>>>>>>> {"type": "Feature", "geometry": >>>>>>>>>> {"type":"Point","coordinates":[1,1]}, "properties": {*"id"*: 1}} >>>>>>>>> >>>>>>>>> Do you have any idea to overcome this issue? I did not find how to >>>>>>>>> produce a "t.*" with SQLAlchemy... >>>>>>>> >>>>>>>> >>>>>>>> There should definitely be some way for this to work without doing >>>>>>>> "*". what if "t" didn't have the columns in that specific order? the >>>>>>>> "ROW" function seems like what should be used but I don't understand >>>>>>>> the "column names" issue, is this regarding what goes into the JSON >>>>>>>> structure that the PG function returns? there should be a way to >>>>>>>> affect that at the SQL level. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> >>>>>>>>> Thanks :-) >>>>>>>>> >>>>>>>>> `` >>>>>>>>> >>>>>>>>> Le lundi 20 janvier 2020 18:05:31 UTC+1, Mike Bayer a écrit : >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Sun, Jan 19, 2020, at 12:23 PM, Stephan Hügel wrote: >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Sunday, 19 January 2020 16:13:40 UTC, Mike Bayer wrote: >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> 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 sqlal...@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>. >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Thanks for the quick response Mike! >>>>>>>>>>> >>>>>>>>>>> OK so far I've got: >>>>>>>>>>> https://gist.github.com/urschrei/782989d0b3bee8e4208eb2bea945b65b. >>>>>>>>>>> Requires PostGIS 3.0.x as an extension, and requires GeoAlchemy2. >>>>>>>>>>> >>>>>>>>>>> On line 15, I fixed what I assume was a typo for selectable in your >>>>>>>>>>> original suggestion. I still get the expected >>>>>>>>>>> >>>>>>>>>>> Object <class '__main__.Hardinfra'> is not legal as a SQL literal >>>>>>>>>>> value >>>>>>>>>>> >>>>>>>>>>> error though. I don't follow your suggestion about >>>>>>>>>>> >>>>>>>>>>> "if this_looks_like_a_row(args): self.type = Feature else: >>>>>>>>>>> self.type=Geometry" >>>>>>>>>> >>>>>>>>>> that was pseudocode. If the incoming argument is a "selectable", >>>>>>>>>> that is, has a .c attribute, it's a set of columns, therefore, it's >>>>>>>>>> a row. otherwise, it's not. >>>>>>>>>> >>>>>>>>>> Here's complete POC >>>>>>>>>> >>>>>>>>>> from sqlalchemy import Column >>>>>>>>>> from sqlalchemy import func >>>>>>>>>> from sqlalchemy import inspect >>>>>>>>>> from sqlalchemy import Integer >>>>>>>>>> from sqlalchemy import String >>>>>>>>>> from sqlalchemy.ext.declarative import declarative_base >>>>>>>>>> from sqlalchemy.sql.functions import GenericFunction >>>>>>>>>> from sqlalchemy.types import UserDefinedType >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> class Feature(UserDefinedType): >>>>>>>>>> pass >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> class Geometry(UserDefinedType): >>>>>>>>>> pass >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> class MyGj(GenericFunction): >>>>>>>>>> def __init__(self, *args, **kw): >>>>>>>>>> pass_args = [] >>>>>>>>>> for arg in args: >>>>>>>>>> insp = inspect(arg) >>>>>>>>>> if hasattr(insp, "selectable"): >>>>>>>>>> pass_args.extend(insp.selectable.c) >>>>>>>>>> self.type = Feature >>>>>>>>>> else: >>>>>>>>>> self.type = Geometry >>>>>>>>>> pass_args.append(arg) >>>>>>>>>> super(MyGj, self).__init__(*pass_args, **kw) >>>>>>>>>> >>>>>>>>>> name = "ST_AsGeoJson" >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Base = declarative_base() >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> class A(Base): >>>>>>>>>> __tablename__ = "a" >>>>>>>>>> >>>>>>>>>> id = Column(Integer, primary_key=True) >>>>>>>>>> data = Column(String) >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> function = func.ST_AsGeoJson(A) >>>>>>>>>> >>>>>>>>>> assert isinstance(function.type, Feature) >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> print(function) >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> possibly because I'm not well-versed in SQLA's internals – is there >>>>>>>>>>> an easy way to distinguish between a row and a column? That still >>>>>>>>>>> leaves the issue of the "Geometry" vs "Feature" distinction in >>>>>>>>>>> self.types: Geoalchemy2 defines a "Geometry" type, but not a >>>>>>>>>>> "Feature" type, because "Feature" is only a part of the GeoJSON >>>>>>>>>>> spec, but I doubt that either of these things are causing the >>>>>>>>>>> problem. I've also tried executing the SQL query on my db to make >>>>>>>>>>> sure it's working and both >>>>>>>>>>> >>>>>>>>>>> SELECT ST_AsGeoJSON(t.*) FROM hardinfra as t WHERE t.id = 1; >>>>>>>>>>> SELECT ST_AsGeoJSON(t.geom) FROM hardinfra as t WHERE t.id = 1; >>>>>>>>>>> >>>>>>>>>>> work, returning a GeoJSON Feature and Geometry respectively. >>>>>>>>>>> >>>>>>>>>>> I didn't open the issue about SQL Server, but I use GeoAlchemy >>>>>>>>>>> regularly, so if there are intro issues available I'm happy to help >>>>>>>>>>> out when I can. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> 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 sqlal...@googlegroups.com. >>>>>>>>>>> To view this discussion on the web visit >>>>>>>>>>> https://groups.google.com/d/msgid/sqlalchemy/795a8d14-17da-4c47-a917-78f355e88951%40googlegroups.com >>>>>>>>>>> >>>>>>>>>>> <https://groups.google.com/d/msgid/sqlalchemy/795a8d14-17da-4c47-a917-78f355e88951%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 sqlal...@googlegroups.com. >>>>>>>>> To view this discussion on the web visit >>>>>>>>> https://groups.google.com/d/msgid/sqlalchemy/fedacdfa-5bd6-4f6c-9c0a-e2f8287585b7%40googlegroups.com >>>>>>>>> >>>>>>>>> <https://groups.google.com/d/msgid/sqlalchemy/fedacdfa-5bd6-4f6c-9c0a-e2f8287585b7%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/8410c4e7-bf98-45b7-9b43-ae9157152aef%40googlegroups.com >>>>>>> >>>>>>> <https://groups.google.com/d/msgid/sqlalchemy/8410c4e7-bf98-45b7-9b43-ae9157152aef%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 a topic in the >>>>>> Google Groups "sqlalchemy" group. >>>>>> To unsubscribe from this topic, visit >>>>>> https://groups.google.com/d/topic/sqlalchemy/owT52zKYNVw/unsubscribe. >>>>>> To unsubscribe from this group and all its topics, send an email to >>>>>> sqlalchemy+unsubscr...@googlegroups.com. >>>>>> To view this discussion on the web visit >>>>>> https://groups.google.com/d/msgid/sqlalchemy/0d878447-57c6-414b-9785-a41ebb9486e4%40www.fastmail.com >>>>>> >>>>>> <https://groups.google.com/d/msgid/sqlalchemy/0d878447-57c6-414b-9785-a41ebb9486e4%40www.fastmail.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/CAKuTeydbAbY9VLJFAbK42gLPO6maeugyX0ciJjrwotArabtASQ%40mail.gmail.com >>>>> >>>>> <https://groups.google.com/d/msgid/sqlalchemy/CAKuTeydbAbY9VLJFAbK42gLPO6maeugyX0ciJjrwotArabtASQ%40mail.gmail.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 a topic in the >>>> Google Groups "sqlalchemy" group. >>>> To unsubscribe from this topic, visit >>>> https://groups.google.com/d/topic/sqlalchemy/owT52zKYNVw/unsubscribe. >>>> To unsubscribe from this group and all its topics, send an email to >>>> sqlalchemy+unsubscr...@googlegroups.com. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/sqlalchemy/ef6eae5a-4c1e-4b43-82ab-854c89924938%40www.fastmail.com >>>> >>>> <https://groups.google.com/d/msgid/sqlalchemy/ef6eae5a-4c1e-4b43-82ab-854c89924938%40www.fastmail.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/CAKuTeydSZwR-aUt0k9sXVtkGPhwd3uidbLc97SNKF1cw%2BJiAsA%40mail.gmail.com >>> >>> <https://groups.google.com/d/msgid/sqlalchemy/CAKuTeydSZwR-aUt0k9sXVtkGPhwd3uidbLc97SNKF1cw%2BJiAsA%40mail.gmail.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 a topic in the >> Google Groups "sqlalchemy" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/sqlalchemy/owT52zKYNVw/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> sqlalchemy+unsubscr...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/sqlalchemy/7067863f-c502-4d9d-91e7-3e58e9122339%40www.fastmail.com >> >> <https://groups.google.com/d/msgid/sqlalchemy/7067863f-c502-4d9d-91e7-3e58e9122339%40www.fastmail.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/CAKuTeyf%2B1r0i8ZCGJBOqRgNEmprC0J4pmo4O9HzwYa471j6CyQ%40mail.gmail.com > > <https://groups.google.com/d/msgid/sqlalchemy/CAKuTeyf%2B1r0i8ZCGJBOqRgNEmprC0J4pmo4O9HzwYa471j6CyQ%40mail.gmail.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/84dde841-8b7c-4e2b-b47c-776048e231a1%40www.fastmail.com.