Re: [sqlalchemy] Re: Postgres Composite Columns

2017-09-18 Thread Tolstov Sergey

>
> 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

2017-09-18 Thread 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
> "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

2017-09-18 Thread Tolstov Sergey

>
> 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.