your imports can't provide ARRAY class, I've added: from sqlalchemy.dialects.postgresql import ARRAY. My version is 1.0.14. Output: /home/anton/Projects/.venv/lib/python2.7/site-packages/sqlalchemy/sql/sqltypes.py:185: SAWarning: Unicode type received non-unicode bind param value 'y'. (this warning may be suppressed after 10 occurrences) (util.ellipses_string(value),)) /home/anton/Projects/.venv/lib/python2.7/site-packages/sqlalchemy/sql/sqltypes.py:185: SAWarning: Unicode type received non-unicode bind param value 'x'. (this warning may be suppressed after 10 occurrences) (util.ellipses_string(value),)) ['{', '"', '(', 'x', ',', 'y', ')', '"', '}']
And about jsonb_object_agg. I use PostgreSQL 9.5. If you use older version, you can try to replace it with json_object_agg. I wrote such code: from sqlalchemy import * from sqlalchemy.dialects.postgresql import ARRAY from hasoffers.core.model import Base from hasoffers.core.model import Session class A(Base): __tablename__ = 'a' id = Column(Integer, primary_key=True, autoincrement=True) x = Column(Unicode) y = Column(Unicode) class B(Base): __tablename__ = 'b' id = Column(Integer, primary_key=True, autoincrement=True) a_keys = Column(ARRAY(Integer)) col1 = Column(Unicode) col2 = Column(Unicode) Base.metadata.bind = Session.bind Base.metadata.create_all() Session.add(A(x="x", y="y")) Session.add(A(x="f", y="j")) Session.add(A(x="b", y="s")) Session.add(B(a_keys=[1], col1="qaz", col2="qwe")) Session.add(B(a_keys=[2,3], col1="zaq", col2="fds")) Session.add(B(a_keys=[2,3], col1="gtr", col2="ascs")) Session.commit() for row in Session.query(A, func.jsonb_object_agg(B.col1, B.col2)).join(B, A.id == func.any(B.a_keys)).group_by(A.id): print row After execution I got such traceback: Traceback (most recent call last): File "/home/anton/Projects/.../core/hasoffers/core/run/stuff.py", line 33, in <module> for row in Session.query(A, func.jsonb_object_agg(B.col1, B.col2)).join(B, A.id == func.any(B.a_keys)).group_by(A.id): File "/home/anton/Projects/.venv/lib/python2.7/site-packages/sqlalchemy/orm/loading.py", line 86, in instances util.raise_from_cause(err) File "/home/anton/Projects/.venv/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 202, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause) File "/home/anton/Projects/.venv/lib/python2.7/site-packages/sqlalchemy/orm/loading.py", line 77, in instances rows = util.unique_list(rows, filter_fn) File "/home/anton/Projects/.venv/lib/python2.7/site-packages/sqlalchemy/util/_collections.py", line 757, in unique_list if hashfunc(x) not in seen TypeError: unhashable type: 'dict' вторник, 11 апреля 2017 г., 16:43:20 UTC+3 пользователь Mike Bayer написал: > > can't reproduce (though the ARRAY(unicode) type is not what psycopg2 > returns, and there seems to be a difference in behavior between > sqlalchemy.ARRAY and sqlalchemy.dialects.postgresql.ARRAY). > > please provide a complete example based on the below test script and > stack traces > > also my PG database doesn't know about the jsonb_object_agg function > > from sqlalchemy import * > from sqlalchemy.orm import * > from sqlalchemy.ext.declarative import declarative_base > > Base = declarative_base() > > > class A(Base): > __tablename__ = 'a' > id = Column(Integer, primary_key=True) > x = Column(Unicode) > y = Column(Unicode) > > e = create_engine("postgresql://scott:tiger@localhost/test", echo=True) > Base.metadata.drop_all(e) > Base.metadata.create_all(e) > > s = Session(e) > s.add(A(x="x", y="y")) > s.commit() > > row = s.query(func.array_agg(tuple_(A.x, A.y), > type_=ARRAY(Unicode))).scalar() > print row > > > > > > On 04/11/2017 09:04 AM, Антонио Антуан wrote: > > Hi > > I want to build such query with sqlalchemy: > > | > > SELECT array_agg((column1,column2))fromtable > > | > > > > Using psql it works perfectly and returns such result: > > | > > {"(col1_row1_value, col2_row1_value)","(col1_row2_value, > > col2_row2_value)"...} > > | > > > > I tried several forms of SQLA-query: > > > > |>> from sqlalchemy.dialects.postgresql import ARRAY > >>> from sqlalchemy.sql.elements import Tuple > >>> ... > func.array_agg(Tuple(Model.col1,Model.col2),type_=ARRAY(Unicode))... > > ... > > TypeError: unhashable type: 'list' > >>> ... func.array_agg(Tuple(Model.col1, Model.col2), type_=ARRAY(Unicode, > > as_tuple=True))... > > ...# returns value like this: ('{', '"', '(', 'c',...) > >>> ... func.array_agg(Tuple(Model.col1, Model.col2), type_=ARRAY(Tuple, > > as_tuple=True))... > > ... > > AttributeError: Neither 'Tuple' object nor 'Comparator' object has an > > attribute 'dialect_impl' > > | > > > > At first, I wanted to use /`func.jsonb_object_agg(Model.col1, > > Model.col2)`/, but it raises */"unhashable type: dict"/* > > */ > > /* > > Could you point to solution? > > > > -- > > 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 <javascript:> > > <mailto:sqlalchemy+unsubscr...@googlegroups.com <javascript:>>. > > To post to this group, send email to sqlal...@googlegroups.com > <javascript:> > > <mailto:sqlal...@googlegroups.com <javascript:>>. > > 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.