[sqlalchemy] mapper error, and db object cannot be incremented

2011-06-14 Thread Liju
I'm new to SQLAlchemy. I wrote a method that retrieves a record,
update the object after incrementing it by 1, and return that record
object to the caller (pyramid view). Following is the test function. I
get following errors :

1) when I call this method multiple times, I get an error that say
ArgumentError: Class 'class 'cas.models.Models'' already has a
primary mapper defined. Use non_primary=True to create a non primary
Mapper. clear_mappers() will remove *all* current mappers from all
classes.

As a resolution i called 'clear_mappers()' before invoking mapper.

2) I cant seem to increment the attribute of an object in orm session.
My understanding is that once a record is retrieved in an ORM session,
Session object keeps track of any changes to the record object and
updates the record when session.flush() is invoked.
But I get error TypeError: unsupported operand type(s) for +:
'instancemethod' and 'int'

Can someone please explain to me what I'm doing wrong ?

class Models(object):pass

def countAndIncrement():
metadata = MetaData('sqlite:///CAS.db')

model_table = Table('models',
metadata,
Column('id',Integer,primary_key=True),
Column('name',String(40)),
Column('value',Integer)
)

clear_mappers()

mapper(Models,model_table)   #  already a
primary mapper defined error (when I call this function multiple times

Session = sessionmaker()
session = Session()

model = session.query(Models).filter(Models.id==1)

model.value = model.value + 1 #
 increment error

session.flush()
session.close()

return model

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.



Re: [sqlalchemy] mapper error, and db object cannot be incremented

2011-06-14 Thread Michael Bayer
You're best starting with the declarative usage patterns described in the ORM 
tutorial at http://www.sqlalchemy.org/docs/orm/tutorial.html, starting with 
http://www.sqlalchemy.org/docs/orm/tutorial.html#creating-table-class-and-mapper-all-at-once-declaratively.
  I would declare the class + table + mapping at once, to eliminate any 
confusion regarding mapping, which is not a per-usage operation; it is a 
permanent operation applied to a model class only once. The mapper() + 
Table pattern is not as easy to use and it's being de-emphasized in the 
documentation.

The second error implies your class has a method called value() on it which is 
conflicting with the mapped attribute of .value.




On Jun 14, 2011, at 12:22 PM, Liju wrote:

 I'm new to SQLAlchemy. I wrote a method that retrieves a record,
 update the object after incrementing it by 1, and return that record
 object to the caller (pyramid view). Following is the test function. I
 get following errors :
 
 1) when I call this method multiple times, I get an error that say
 ArgumentError: Class 'class 'cas.models.Models'' already has a
 primary mapper defined. Use non_primary=True to create a non primary
 Mapper. clear_mappers() will remove *all* current mappers from all
 classes.
 
 As a resolution i called 'clear_mappers()' before invoking mapper.
 
 2) I cant seem to increment the attribute of an object in orm session.
 My understanding is that once a record is retrieved in an ORM session,
 Session object keeps track of any changes to the record object and
 updates the record when session.flush() is invoked.
 But I get error TypeError: unsupported operand type(s) for +:
 'instancemethod' and 'int'
 
 Can someone please explain to me what I'm doing wrong ?
 
 class Models(object):pass
 
 def countAndIncrement():
metadata = MetaData('sqlite:///CAS.db')
 
model_table = Table('models',
metadata,
Column('id',Integer,primary_key=True),
Column('name',String(40)),
Column('value',Integer)
)
 
clear_mappers()
 
mapper(Models,model_table)   #  already a
 primary mapper defined error (when I call this function multiple times
 
Session = sessionmaker()
session = Session()
 
model = session.query(Models).filter(Models.id==1)
 
model.value = model.value + 1 #
  increment error
 
session.flush()
session.close()
 
return model
 
 -- 
 You received this message because you are subscribed to the Google Groups 
 sqlalchemy group.
 To post to this group, send email to sqlalchemy@googlegroups.com.
 To unsubscribe from this group, send email to 
 sqlalchemy+unsubscr...@googlegroups.com.
 For more options, visit this group at 
 http://groups.google.com/group/sqlalchemy?hl=en.
 

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.