SQLAlchemy doesnt expect your class to have customizations going on with __new__(). either fix your __new__() method to require only the cls argument, or create a MapperExtension that provides the create_instance() method, so that you create new instances yourself:
http://www.sqlalchemy.org/docs/ adv_datamapping.html#advdatamapping_extending On Jun 10, 2007, at 3:36 PM, nathan harmston wrote: > HI, > > I m currently trying to build an api for a database and I really > like the way that Djangos manager ( Class_name.objects ). This > seems very intuitive for me. After reading through the some of the > django source and getting slightly confused I ve implemented a > basic version for one of my tables. The problem is I get an > exception, when I m not expecting one. If this isnt a specific > sqlalchemy question then please tell me so I can re-post to python > etc. > > registry.py --> contains table definitions etc. > > Manager.py > > from Registry import * > > class Manager(object): > def __init__(self, model, table=None): > self.model = model > self.table = table > def get(self, slice): > pass > def all(self): > print "1" > mapper(self.model, interpro_table) > print "2" > session = create_session() > print "3" > query = session.query(self.model) > print "4" > return query.select() > > Models.py > > from Manager import * > > class ModelBase(type): > def __new__(cls, name, bases, dict): > print cls > setattr(cls, 'objects', Manager(cls)) > return type.__new__(cls, name, bases, dict) > > class Model(object): > __metaclass__=ModelBase > > class InterPro(Model): > _tableName = interpro_table > def __init__(self, interpro_ac): > self.interpro_ac = interpro_ac > def __str__(self): > return "InterPro: %s" %(self.interpro_ac) > def __repr__(self): > return "InterPro: %s" %(self.interpro_ac) > > if __name__=='__main__': > a = Manager(InterPro) > print a > print a.all() --> this prints out all of the objects in the > database > i = InterPro('IPR014697') > print InterPro.objects > print InterPro.objects.all() > --> this fails and produces the exception. > > Traceback (most recent call last): > File "Model.py ", line 28, in ? > print InterPro.objects.all() > File "/home/skeg/workspace/test/src/Manager.py", line 17, in all > return query.select() > File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/query.py", > line 247, in select > return self.select_whereclause(whereclause=arg, **kwargs) > File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/query.py", > line 252, in select_whereclause > return self._select_statement(statement, params=params) > File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/query.py", > line 378, in _select_statement > return self.execute(statement, params=params, **kwargs) > File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/query.py", > line 310, in execute > return self.instances(result, **kwargs) > File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/query.py", > line 329, in instances > self.mapper._instance(context, row, result) > File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/mapper.py", > line 1213, in _instance > instance = self._create_instance(context.session) > File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/mapper.py", > line 1234, in _create_instance > obj = self.class_.__new__(self.class_) > TypeError: __new__() takes exactly 4 arguments (1 given) > > Does anyone know what the problem is? Is it the way I ve programmed > this using metaclasses or is it sqlalchemy and the way in > instantiates objects or even both? > > Many Thanks in advance, > > Nathan > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---
