On Nov 19, 2013, at 7:10 AM, Chris Withers <[email protected]> wrote:
> Hi All,
>
> I have this simple model/table:
>
> class Part(Common, Base):
>
> __tablename__ = 'transaction'
>
> id = Column(Integer(), primary_key=True) # one per transaction
> part = Column(Integer(), primary_key=True) # one per part
> timestamp = Column(DateTime(), nullable=False)
>
> source = Column(String(20), primary_key=True)
>
> account_id = account_col()
> account = relationship("Account")
> instrument_id = instrument_col(primary_key=False)
> instrument = relationship("Instrument")
> quantity = Column(Numeric())
>
> This query (which seems simple enough to me):
>
> session.query(Part.instrument, func.sum(Part.quantity))\
> .filter((Part.account_id=='td') & (Part.timestamp < date(2013, 11, 1)))\
> .group_by(Part.instrument)\
> .all()
we don’t support query(Cls.relationshipname) as of yet, it’s spitting out the
join condition into the columns clause, and in any case you’d need to specify a
real join() in order to get Part and Instrument into the same SELECT:
query(Instrument,
func.sum(Part.quantity)).select_from(Part).join(Part.instrument)…
>
> ...gives a rather bizarre result:
>
> [(False, Decimal('-71385059.09597850000')),
> (True, Decimal('-16737.41127690000'))]
>
> Tweak it slightly and it blows up like this:
>
> session.rollback()
> session.query(Part.instrument, func.sum(Part.quantity))\
> .filter((Part.account_id=='td') & (Part.timestamp < date(2013, 11, 1)))\
> .group_by(Part.instrument_id)\
> .all()
>
> <ipython-input-43-c2c5e3817a95> in <module>()
> 2 session.query(Part.instrument, func.sum(Part.quantity))\
> 3 .filter((Part.account_id=='td') & (Part.timestamp < date(2013,
> 11, 1)))\
> ----> 4 .group_by(Part.instrument_id)\
> 5 .all()
>
> /Users/chris/buildout-eggs/SQLAlchemy-0.8.2-py2.7-macosx-10.5-x86_64.egg/sqlalchemy/orm/query.pyc
> in all(self)
> 2235
> 2236 """
> -> 2237 return list(self)
> 2238
> 2239 @_generative(_no_clauseelement_condition)
>
> /Users/chris/buildout-eggs/SQLAlchemy-0.8.2-py2.7-macosx-10.5-x86_64.egg/sqlalchemy/orm/query.pyc
> in __iter__(self)
> 2347 if self._autoflush and not self._populate_existing:
> 2348 self.session._autoflush()
> -> 2349 return self._execute_and_instances(context)
> 2350
> 2351 def _connection_from_session(self, **kw):
>
> /Users/chris/buildout-eggs/SQLAlchemy-0.8.2-py2.7-macosx-10.5-x86_64.egg/sqlalchemy/orm/query.pyc
> in _execute_and_instances(self, querycontext)
> 2362 close_with_result=True)
> 2363
> -> 2364 result = conn.execute(querycontext.statement, self._params)
> 2365 return loading.instances(self, result, querycontext)
> 2366
>
> /Users/chris/buildout-eggs/SQLAlchemy-0.8.2-py2.7-macosx-10.5-x86_64.egg/sqlalchemy/engine/base.pyc
> in execute(self, object, *multiparams, **params)
> 660 object,
> 661 multiparams,
> --> 662 params)
> 663 else:
> 664 raise exc.InvalidRequestError(
>
> /Users/chris/buildout-eggs/SQLAlchemy-0.8.2-py2.7-macosx-10.5-x86_64.egg/sqlalchemy/engine/base.pyc
> in _execute_clauseelement(self, elem, multiparams, params)
> 759 compiled_sql,
> 760 distilled_params,
> --> 761 compiled_sql, distilled_params
> 762 )
> 763 if self._has_events:
>
> /Users/chris/buildout-eggs/SQLAlchemy-0.8.2-py2.7-macosx-10.5-x86_64.egg/sqlalchemy/engine/base.pyc
> in _execute_context(self, dialect, constructor, statement, parameters, *args)
> 872 parameters,
> 873 cursor,
> --> 874 context)
> 875
> 876 if self._has_events:
>
> /Users/chris/buildout-eggs/SQLAlchemy-0.8.2-py2.7-macosx-10.5-x86_64.egg/sqlalchemy/engine/base.pyc
> in _handle_dbapi_exception(self, e, statement, parameters, cursor, context)
> 1022 self.dialect.dbapi.Error,
> 1023 connection_invalidated=self._is_disconnect),
> -> 1024 exc_info
> 1025 )
> 1026
>
> /Users/chris/buildout-eggs/SQLAlchemy-0.8.2-py2.7-macosx-10.5-x86_64.egg/sqlalchemy/util/compat.pyc
> in raise_from_cause(exception, exc_info)
> 193 # the code line where the issue occurred
> 194 exc_type, exc_value, exc_tb = exc_info
> --> 195 reraise(type(exception), exception, tb=exc_tb)
> 196
> 197
>
> /Users/chris/buildout-eggs/SQLAlchemy-0.8.2-py2.7-macosx-10.5-x86_64.egg/sqlalchemy/engine/base.pyc
> in _execute_context(self, dialect, constructor, statement, parameters, *args)
> 865 statement,
> 866 parameters,
> --> 867 context)
> 868 except Exception, e:
> 869 self._handle_dbapi_exception(
>
> /Users/chris/buildout-eggs/SQLAlchemy-0.8.2-py2.7-macosx-10.5-x86_64.egg/sqlalchemy/engine/default.pyc
> in do_execute(self, cursor, statement, parameters, context)
> 322
> 323 def do_execute(self, cursor, statement, parameters, context=None):
> --> 324 cursor.execute(statement, parameters)
> 325
> 326 def do_execute_no_params(self, cursor, statement, context=None):
>
> ProgrammingError: (ProgrammingError) column "instrument.id" must appear in
> the GROUP BY clause or be used in an aggregate function
> LINE 1: SELECT instrument.id = transaction.instrument_id AS instrume...
> ^
> 'SELECT instrument.id = transaction.instrument_id AS instrument,
> sum(transaction.quantity) AS sum_1 \nFROM instrument, transaction \nWHERE
> transaction.account_id = %(account_id_1)s AND transaction.timestamp <
> %(timestamp_1)s GROUP BY transaction.instrument_id' {'account_id_1': 'td',
> 'timestamp_1': datetime.date(2013, 11, 1)}
>
> What am I doing wrong?
>
> Chris
> --
> Simplistix - Content Management, Batch Processing & Python Consulting
> - http://www.simplistix.co.uk
>
> --
> 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 [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/groups/opt_out.
signature.asc
Description: Message signed with OpenPGP using GPGMail
