[sqlalchemy] Re: inferring object class/table directly

2008-12-03 Thread rdmurray

On Tue, 2 Dec 2008 at 23:21, Faheem Mitha wrote:
 Yes, I was looking for this, and printed out obj.__dict__ but didn't
 see it there. A dictionary of attributes is very useful in theory, but
 doesn't always seem to have all attributes. Is this documented
 anywhere?

Try dir(obj).  You'll see it there.  The __dict__ is only for instance
attributes.

 Not too difficult.  You can also use type(obj) instead of
 obj.__class__.

 I thought of trying this, but didn't. It didn't seem likely to work,
 anyway. Is either of these preferred over the other in terms of API
 stability, and if so, why?

obj.__class__ is a python thing, as is type(obj), and neither of
those is changing in python 3.0, so I'd think both would be stable API
wise :)  However, the documentation of __class__ makes it clear you
get the class back, while the documentation of the 'type' built in
function does not...so I'd lean toward using __class__, myself.  It
also means you'll get an earlier error if you accidentally pass
something that is not actually a class instance into your function.

--RDM

--~--~-~--~~~---~--~~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~--~~~~--~~--~--~---



[sqlalchemy] Re: inferring object class/table directly

2008-12-03 Thread Faheem Mitha

On Wed, 3 Dec 2008 08:58:42 -0500 (EST), [EMAIL PROTECTED]
[EMAIL PROTECTED] wrote:

 On Tue, 2 Dec 2008 at 23:21, Faheem Mitha wrote:
 Yes, I was looking for this, and printed out obj.__dict__ but didn't
 see it there. A dictionary of attributes is very useful in theory, but
 doesn't always seem to have all attributes. Is this documented
 anywhere?

 Try dir(obj).  You'll see it there.  The __dict__ is only for instance
 attributes.

Excellent. This is the first I've heard of this function, but
apparently it is a Python builtin. Well past time to go read the docs
for this, I guess.

 Not too difficult.  You can also use type(obj) instead of
 obj.__class__.

 I thought of trying this, but didn't. It didn't seem likely to work,
 anyway. Is either of these preferred over the other in terms of API
 stability, and if so, why?

 obj.__class__ is a python thing, as is type(obj), and neither of
 those is changing in python 3.0, so I'd think both would be stable API
 wise :)  However, the documentation of __class__ makes it clear you
 get the class back, while the documentation of the 'type' built in
 function does not...so I'd lean toward using __class__, myself.  It
 also means you'll get an earlier error if you accidentally pass
 something that is not actually a class instance into your function.

Thanks. That's very helpful.
 Regards, Faheem.



--~--~-~--~~~---~--~~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~--~~~~--~~--~--~---



[sqlalchemy] Re: inferring object class/table directly

2008-12-02 Thread Eric Ongerth

def add_obj(session, obj):
  Check if object primary key exists in db. If so,exit, else
 add.
 
 pid = obj.id
if session.query(obj.__class__).filter_by(id=pid).count():
 print Patient object with id %s is already in db.%pid
 exit
 else:
 session.save(obj)
 session.commit()


Not too difficult.  You can also use type(obj) instead of
obj.__class__.

Furthermore, if you really need to determine the object's class's
mapped table,
obj_table = obj.__class__._sa_class_manager.mapper.mapped_table

Of course, being an underscored thing, _sa_class_manager is not
something you should count on from version to version of sqlalchemy,
so keep that in consideration and don't use it anywhere you don't plan
to maintain.

Eric


On Dec 2, 2:24 pm, Faheem Mitha [EMAIL PROTECTED] wrote:
 Hi,

 If I have an ORM object, it is sometimes convenient to be able to infer
 the class directly. Eg. consider this function.

 def add_patient_obj(session, patient_obj):
       Check if object primary key exists in db. If so,exit, else
      add.
      pid = patient_obj.id
      #print session.query(Patient).filter_by(id=pid).count()
      if session.query(Patient).filter_by(id=pid).count()  0:
          print Patient object with id %s is already in db.%pid
          exit
      else:
          session.save(patient_obj)
          session.commit()

 But I want a generic version. Since patient_obj knows what class is
 belongs to, it should be possible not to have to state the class directly,
 which here is Patient.

 I have done the following, which works, but is hideous, horrible, ugly,
 fragile hack. Can anyone suggest a better way of doing this?

 Please CC me on any reply. Thanks in advance.

                                                     Regards, Faheem.

 def add_obj(session, obj):
       Check if object primary key exists in db. If so,exit, else
      add.
      
      c = str(type(obj)).split(')[1].split(.)[1]
      s = q = session.query(+ c +)
      exec(s)
      pid = obj.id
      if q.filter_by(id=pid).count()  0:
          print Patient object with id %s is already in db.%pid
          exit
      else:
          session.save(obj)
          session.commit()
--~--~-~--~~~---~--~~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~--~~~~--~~--~--~---



[sqlalchemy] Re: inferring object class/table directly

2008-12-02 Thread Michael Bayer


On Dec 2, 2008, at 6:04 PM, Eric Ongerth wrote:


 def add_obj(session, obj):
  Check if object primary key exists in db. If so,exit, else
 add.
 
 pid = obj.id
if session.query(obj.__class__).filter_by(id=pid).count():
 print Patient object with id %s is already in db.%pid
 exit
 else:
 session.save(obj)
 session.commit()


 Not too difficult.  You can also use type(obj) instead of
 obj.__class__.

 Furthermore, if you really need to determine the object's class's
 mapped table,
 obj_table = obj.__class__._sa_class_manager.mapper.mapped_table

here's the API way:

object_mapper(obj).mapped_table



--~--~-~--~~~---~--~~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~--~~~~--~~--~--~---



[sqlalchemy] Re: inferring object class/table directly

2008-12-02 Thread Faheem Mitha

[This message has also been posted.]
Hi Eric,

Thanks very much for the improvement.

On Tue, 2 Dec 2008 15:04:34 -0800 (PST), Eric Ongerth
[EMAIL PROTECTED] wrote:

 def add_obj(session, obj):
   Check if object primary key exists in db. If so,exit, else
  add.
  
  pid = obj.id
 if session.query(obj.__class__).filter_by(id=pid).count():
  print Patient object with id %s is already in db.%pid
  exit
  else:
  session.save(obj)
  session.commit()

Yes, I was looking for this, and printed out obj.__dict__ but didn't
see it there. A dictionary of attributes is very useful in theory, but
doesn't always seem to have all attributes. Is this documented
anywhere?

 Not too difficult.  You can also use type(obj) instead of
 obj.__class__.

I thought of trying this, but didn't. It didn't seem likely to work,
anyway. Is either of these preferred over the other in terms of API
stability, and if so, why?

 Furthermore, if you really need to determine the object's class's
 mapped table,
 obj_table = obj.__class__._sa_class_manager.mapper.mapped_table

 Of course, being an underscored thing, _sa_class_manager is not
 something you should count on from version to version of sqlalchemy,
 so keep that in consideration and don't use it anywhere you don't plan
 to maintain.

Not sure what the object class's mapped table is, but will look it up.

  Regards, Faheem.

--~--~-~--~~~---~--~~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~--~~~~--~~--~--~---



[sqlalchemy] Re: inferring object class/table directly

2008-12-02 Thread Faheem Mitha

[This message has also been posted.]
On Tue, 2 Dec 2008 18:25:19 -0500, Michael Bayer
[EMAIL PROTECTED] wrote:

 On Dec 2, 2008, at 6:04 PM, Eric Ongerth wrote:

[snip]
 Furthermore, if you really need to determine the object's class's
 mapped table,
 obj_table = obj.__class__._sa_class_manager.mapper.mapped_table

 here's the API way:

 object_mapper(obj).mapped_table

Hi Michael,

Thanks for the clarification.

 Regards, Faheem.

--~--~-~--~~~---~--~~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~--~~~~--~~--~--~---