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()
...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 sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.