On Thu, Jan 4, 2018 at 3:33 PM, sector119 <sector...@gmail.com> wrote: > Thank you, Mike, but I need something like this > > > type_coerce( > > Database.meters_readings[ > > func.generate_subscripts(Database.meters_readings, 1) > > ], type_=ARRAY(Text) > > )[1] > > > Database.meters_readings is two-dimensional array like [ ['1', '2', '3'], > ['4', '5', '6'] ], so
okey doke, give your array two dimensions: >>> f = func.generate_subscripts(column('x'), type_=ARRAY(Integer, >>> dimensions=2)) >>> print f[1][2] (generate_subscripts(x))[:generate_subscripts_1][:param_1] > > Database.meters_readings[func.generate_subscripts.....] must return ['1', > '2', '3'] or ['4', '5', '6'], > > and than I want to get 1-st or second element of this "sub-array" > > > func.generate_subscripts have to return int and it is Ok, but why I can't > get that "sub-array" without type_coerce? > > > > четверг, 4 января 2018 г., 17:48:56 UTC+2 пользователь Mike Bayer написал: >> >> On Thu, Jan 4, 2018 at 6:49 AM, sector119 <sect...@gmail.com> wrote: >> > Hello, >> > >> > >> > I try to rewrite "meters_readings[generate_subscripts(meters_readings, >> > 1)][1]" from plain sql query that works >> > >> > with sqlalchemy and >> > >> > Database.meters_readings[func.generate_subscripts(Database.meters_readings, >> > 1)][1] doesn't work >> >> >> your func.generate_subscripts() function doesn't know that it needs to >> return a datatype that fulfills the "Indexable" contract, that of >> ARRAY, JSON and HSTORE (though PG documents this as returning "setof", >> that supports indexing? shrugs). You need to give it the type you >> need, which I guess in this case the closest is ARRAY: >> >> >>> f = func.generate_subscripts(column('q'), 1, type_=ARRAY(Integer)) >> >>> print f[5] >> (generate_subscripts(q, :generate_subscripts_1))[:generate_subscripts_2] >> >> >> >> >> > >> > I get NotImplementedError: Operator 'getitem' is not supported on this >> > expression >> > >> > >> > Is it possible? >> > >> > >> > >> > def get_person_meters_q(dbsession, person_id): >> > database = dbsession.query( >> > Database.person_id, >> > Database.service_id, >> > Database.person_id_internal, >> > Database.meters_readings, >> > >> > >> > (Database.meters_readings[func.generate_subscripts(Database.meters_readings, >> > 1)][1]).label('meter_id'), >> > >> > >> > (Database.meters_readings[func.generate_subscripts(Database.meters_readings, >> > 1)][2]).label('organization_reading'), >> > Database.date >> > ).subquery() >> > >> > meter_readings = dbsession.query( >> > MeterReading.user_id, >> > MeterReading.reading >> > ). \ >> > distinct( >> > MeterReading.service_id, >> > MeterReading.person_id_internal, >> > MeterReading.meter_id). \ >> > filter( >> > and_( >> > MeterReading.person_id == database.c.person_id, >> > MeterReading.service_id == database.c.service_id, >> > MeterReading.meter_id == database.c.meter_id, >> > MeterReading.commit_date > database.c.date, >> > MeterReading.rollback_date == None, >> > MeterReading.reading != None >> > ) >> > ). \ >> > order_by( >> > MeterReading.service_id, >> > MeterReading.person_id_internal, >> > MeterReading.meter_id, >> > MeterReading.commit_date.desc(), >> > MeterReading.commit_time.desc() >> > ).subquery().lateral() >> > >> > q = dbsession.query( >> > meter_readings, >> > database >> > ). \ >> > select_from(database). \ >> > outerjoin(meter_readings, true()). \ >> > filter(Database.person_id == person_id) >> > >> > return q >> > >> > >> > >> > File >> > "/home/sector119/PycharmProjects/epsilon/epsilon/scripts/testdb.py", >> > line 98, in get_person_meters_q >> > >> > >> > (Database.meters_readings[func.generate_subscripts(Database.meters_readings, >> > 1)][1]).label('meter_id'), >> > File >> > >> > "/home/sector119/PythonVirtualEnv/epsilon/lib/python3.5/site-packages/sqlalchemy/sql/operators.py", >> > line 411, in __getitem__ >> > return self.operate(getitem, index) >> > File >> > >> > "/home/sector119/PythonVirtualEnv/epsilon/lib/python3.5/site-packages/sqlalchemy/sql/elements.py", >> > line 692, in operate >> > return op(self.comparator, *other, **kwargs) >> > File >> > >> > "/home/sector119/PythonVirtualEnv/epsilon/lib/python3.5/site-packages/sqlalchemy/sql/operators.py", >> > line 411, in __getitem__ >> > return self.operate(getitem, index) >> > File "<string>", line 1, in <lambda> >> > File >> > >> > "/home/sector119/PythonVirtualEnv/epsilon/lib/python3.5/site-packages/sqlalchemy/sql/type_api.py", >> > line 63, in operate >> > return o[0](self.expr, op, *(other + o[1:]), **kwargs) >> > File >> > >> > "/home/sector119/PythonVirtualEnv/epsilon/lib/python3.5/site-packages/sqlalchemy/sql/default_comparator.py", >> > line 192, in _getitem_impl >> > _unsupported_impl(expr, op, other, **kw) >> > File >> > >> > "/home/sector119/PythonVirtualEnv/epsilon/lib/python3.5/site-packages/sqlalchemy/sql/default_comparator.py", >> > line 197, in _unsupported_impl >> > "this expression" % op.__name__) >> > NotImplementedError: Operator 'getitem' is not supported on this >> > expression >> > >> > -- >> > 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+...@googlegroups.com. >> > To post to this group, send email to sqlal...@googlegroups.com. >> > Visit this group at https://groups.google.com/group/sqlalchemy. >> > For more options, visit https://groups.google.com/d/optout. > > -- > 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 post to this group, send email to sqlalchemy@googlegroups.com. > Visit this group at https://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. -- 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 post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.