Re: [sqlalchemy] Re: Postgres Composite Columns
> > Thanks for answer. I don't think so. pg_composite haven't updates 1-3 > years. I already use another table for store data, that's more comfortable and > cross-pratform понедельник, 18 сентября 2017 г., 17:12:13 UTC+3 пользователь Mike Bayer написал: > > On Mon, Sep 18, 2017 at 2:30 AM, Tolstov Sergey> wrote: > >> Hi, i have some issue. I tried to replace namedtuple to dict and list > >> items (with adding hast function to them). But SQLAlchemy types returns > list > >> ordereddict, when i change items, session didn't see changes. Do you > found > >> solution? > > looks like you are using > > http://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.pg_composite > > , I'm not sure if the sqlalchemy-utils maintainer checks this list you > might want to try a github issue with that project. > > > > > def make_hash(o): > > if isinstance(o,(set,tuple,list)): > > for i in o: > > i= tuple([make_hash(e) for e in o]) > > return hash(i) > > elif isinstance(o,dict): > > pass > > i=make_hash([make_hash(j)for j in o.items()]) > > return hash(i) > > > > elif isinstance(o,(str,int)): > > return hash(o) > > else: > > try: > > return hash(o) > > except: > > return make_hash(o.__dict__) > > return hash(o) > > > > > > # sys.exit() > > > > class hashabledict(dict): > > def __key(self): > > return tuple((k,self[k]) for k in sorted(self)) > > def __hash__(self): > > print 'try to make_hash'+str(self)+' result = '+ > str(make_hash(self)) > > return make_hash(self) > > def __eq__(self, other): > > return make_hash(self) == make_hash(other) > > > > class hashablelist(list): > > def __hash__(self): > > return make_hash(self) > > def __eq__(self, other): > > return make_hash(self) == make_hash(other) > > > > class MyCompositeType(CompositeType): > > pass > > def __init__(self, name, columns): > > if psycopg2 is None: > > raise ImproperlyConfigured("'psycopg2' package is required in > order > > to use CompositeType.") > > sqlalchemy.types.SchemaType.__init__(self) > > self.name = name > > self.columns = columns > > if name in registered_composites: > > self.type_cls = registered_composites[name].type_cls > > else: > > temp=hashablelist() > > for c in columns: > > temp.append(c.name) > > self.__dict__.update({c.name:None}) > > self.type_cls=hashabledict({self.name:temp}) > > registered_composites[name] = self > > > > class Caster(psycopg2.extras.CompositeCaster): > > def make(obj, values): > > my_dict=hashabledict() > > for index,data in enumerate(self.type_cls.items()[0][1]): > > if isinstance(values[index], unicode): > > i= values[index].encode("utf-8") > > values[index]=i > > my_dict.update({data:values[index]}) > > j=hashabledict() > > j.update({self.type_cls.items()[0][0]:my_dict}) > > return j > > > > self.caster = Caster > > attach_composite_listeners() > > > > def bind_processor(self, dialect): > > print 'bind_processor' > > def process(value): > > if value is None: > > return None > > out='' > > out=out+ ' '.join('{name}'.format(name=i) > > for i in self.type_cls.items()[0][1]) > > mylist=[] > > for j in value.items(): > > mylist.append(j[1]) > > i=collections.namedtuple(self.name,out) > > return i(*mylist) > > return process > > def result_processor(self, dialect, coltype): > > print 'result_processor' > > # print self.__dict__ > > def process(value): > > print 'my values is'+str(value) > > return value > > self.type_cls=value > > > i=self.__class__(name=value.items()[0][0],columns=value.items()[0][1]) > > # i.set_values(value.items()[0][1],name=value.items()[0][0]) > > return i > > return process > > > > def __hash__(self): > > return make_hash(self) > > def __eq__(self, other): > > return make_hash(self) == make_hash(other) > > def __ne__(self, other): > > return make_hash(self) != make_hash(other) > > > > > > Composite_type = MyCompositeType( > > 'composite_type', > > [ > > sqlalchemy.Column('chislo', sqlalchemy.Integer), > > sqlalchemy.Column('slovo', sqlalchemy.String) > > ] > > ) > > > > -- > > 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
Re: [sqlalchemy] Re: Postgres Composite Columns
On Mon, Sep 18, 2017 at 2:30 AM, Tolstov Sergeywrote: >> Hi, i have some issue. I tried to replace namedtuple to dict and list >> items (with adding hast function to them). But SQLAlchemy types returns list >> ordereddict, when i change items, session didn't see changes. Do you found >> solution? looks like you are using http://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.pg_composite , I'm not sure if the sqlalchemy-utils maintainer checks this list you might want to try a github issue with that project. > > def make_hash(o): > if isinstance(o,(set,tuple,list)): > for i in o: > i= tuple([make_hash(e) for e in o]) > return hash(i) > elif isinstance(o,dict): > pass > i=make_hash([make_hash(j)for j in o.items()]) > return hash(i) > > elif isinstance(o,(str,int)): > return hash(o) > else: > try: > return hash(o) > except: > return make_hash(o.__dict__) > return hash(o) > > > # sys.exit() > > class hashabledict(dict): > def __key(self): > return tuple((k,self[k]) for k in sorted(self)) > def __hash__(self): > print 'try to make_hash'+str(self)+' result = '+ str(make_hash(self)) > return make_hash(self) > def __eq__(self, other): > return make_hash(self) == make_hash(other) > > class hashablelist(list): > def __hash__(self): > return make_hash(self) > def __eq__(self, other): > return make_hash(self) == make_hash(other) > > class MyCompositeType(CompositeType): > pass > def __init__(self, name, columns): > if psycopg2 is None: > raise ImproperlyConfigured("'psycopg2' package is required in order > to use CompositeType.") > sqlalchemy.types.SchemaType.__init__(self) > self.name = name > self.columns = columns > if name in registered_composites: > self.type_cls = registered_composites[name].type_cls > else: > temp=hashablelist() > for c in columns: > temp.append(c.name) > self.__dict__.update({c.name:None}) > self.type_cls=hashabledict({self.name:temp}) > registered_composites[name] = self > > class Caster(psycopg2.extras.CompositeCaster): > def make(obj, values): > my_dict=hashabledict() > for index,data in enumerate(self.type_cls.items()[0][1]): > if isinstance(values[index], unicode): > i= values[index].encode("utf-8") > values[index]=i > my_dict.update({data:values[index]}) > j=hashabledict() > j.update({self.type_cls.items()[0][0]:my_dict}) > return j > > self.caster = Caster > attach_composite_listeners() > > def bind_processor(self, dialect): > print 'bind_processor' > def process(value): > if value is None: > return None > out='' > out=out+ ' '.join('{name}'.format(name=i) > for i in self.type_cls.items()[0][1]) > mylist=[] > for j in value.items(): > mylist.append(j[1]) > i=collections.namedtuple(self.name,out) > return i(*mylist) > return process > def result_processor(self, dialect, coltype): > print 'result_processor' > # print self.__dict__ > def process(value): > print 'my values is'+str(value) > return value > self.type_cls=value > i=self.__class__(name=value.items()[0][0],columns=value.items()[0][1]) > # i.set_values(value.items()[0][1],name=value.items()[0][0]) > return i > return process > > def __hash__(self): > return make_hash(self) > def __eq__(self, other): > return make_hash(self) == make_hash(other) > def __ne__(self, other): > return make_hash(self) != make_hash(other) > > > Composite_type = MyCompositeType( > 'composite_type', > [ > sqlalchemy.Column('chislo', sqlalchemy.Integer), > sqlalchemy.Column('slovo', sqlalchemy.String) > ] > ) > > -- > 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] Re: Postgres Composite Columns
> > Hi, i have some issue. I tried to replace namedtuple to dict and list > items (with adding hast function to them). But SQLAlchemy types returns > list ordereddict, when i change items, session didn't see changes. Do you > found solution? > def make_hash(o): if isinstance(o,(set,tuple,list)): for i in o: i= tuple([make_hash(e) for e in o]) return hash(i) elif isinstance(o,dict): pass i=make_hash([make_hash(j)for j in o.items()]) return hash(i) elif isinstance(o,(str,int)): return hash(o) else: try: return hash(o) except: return make_hash(o.__dict__) return hash(o) # sys.exit() class hashabledict(dict): def __key(self): return tuple((k,self[k]) for k in sorted(self)) def __hash__(self): print 'try to make_hash'+str(self)+' result = '+ str(make_hash(self)) return make_hash(self) def __eq__(self, other): return make_hash(self) == make_hash(other) class hashablelist(list): def __hash__(self): return make_hash(self) def __eq__(self, other): return make_hash(self) == make_hash(other) class MyCompositeType(CompositeType): pass def __init__(self, name, columns): if psycopg2 is None: raise ImproperlyConfigured("'psycopg2' package is required in order to use CompositeType.") sqlalchemy.types.SchemaType.__init__(self) self.name = name self.columns = columns if name in registered_composites: self.type_cls = registered_composites[name].type_cls else: temp=hashablelist() for c in columns: temp.append(c.name) self.__dict__.update({c.name:None}) self.type_cls=hashabledict({self.name:temp}) registered_composites[name] = self class Caster(psycopg2.extras.CompositeCaster): def make(obj, values): my_dict=hashabledict() for index,data in enumerate(self.type_cls.items()[0][1]): if isinstance(values[index], unicode): i= values[index].encode("utf-8") values[index]=i my_dict.update({data:values[index]}) j=hashabledict() j.update({self.type_cls.items()[0][0]:my_dict}) return j self.caster = Caster attach_composite_listeners() def bind_processor(self, dialect): print 'bind_processor' def process(value): if value is None: return None out='' out=out+ ' '.join('{name}'.format(name=i) for i in self.type_cls.items()[0][1]) mylist=[] for j in value.items(): mylist.append(j[1]) i=collections.namedtuple(self.name,out) return i(*mylist) return process def result_processor(self, dialect, coltype): print 'result_processor' # print self.__dict__ def process(value): print 'my values is'+str(value) return value self.type_cls=value i=self.__class__(name=value.items()[0][0],columns=value.items()[0][1]) # i.set_values(value.items()[0][1],name=value.items()[0][0]) return i return process def __hash__(self): return make_hash(self) def __eq__(self, other): return make_hash(self) == make_hash(other) def __ne__(self, other): return make_hash(self) != make_hash(other) Composite_type = MyCompositeType( 'composite_type', [ sqlalchemy.Column('chislo', sqlalchemy.Integer), sqlalchemy.Column('slovo', sqlalchemy.String) ] ) -- 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.