2011-10-05 11 views
6

Quiero saber cómo saber, dado un objeto, si se trata de una instancia de un modelo mapeado sqlalchemy.Compruebe si objeto es una instancia de modelo sqlalchemy

Normalmente, yo usaría isinstance (obj, DeclarativeBase). Sin embargo, en este escenario, no tengo disponible la clase DeclarativeBase (ya que está en un proyecto de dependencia).

Me gustaría saber cuál es la mejor práctica en este caso.

class Person(DeclarativeBase): 
     __tablename__ = "Persons" 

p = Person() 

print isinstance(p, DeclarativeBase) 
#prints True 

#However in my scenario, I do not have the DeclarativeBase available 
#since the DeclarativeBase will be constructed in the depending web app 
#while my code will act as a library that will be imported into the web app 
#what are my alternatives? 
+0

¡proporciona más información! – shahjapan

Respuesta

4

Puede usar class_mapper() y detectar la excepción.
O podría usar _is_mapped_class, pero idealmente no debería hacerlo, ya que no es un método público.

from sqlalchemy.orm.util import class_mapper 
def _is_sa_mapped(cls): 
    try: 
     class_mapper(cls) 
     return True 
    except: 
     return False 
print _is_sa_mapped(MyClass) 

# @note: use this at your own risk as might be removed/renamed in the future 
from sqlalchemy.orm.util import _is_mapped_class 
print bool(_is_mapped_class(MyClass)) 
+0

gracias camioneta. Mi pregunta original era sobre la instancia del objeto, no la clase. ¿Cambio su código a object_mapper en su lugar? – Ahmed

+0

Siempre puede obtener la clase de una instancia; 'tipo (instancia)' – SingleNegationElimination

+0

Claro, puede usar el object_mapper. O como se indicó anteriormente, simplemente obtenga el tipo. Depende de usted... – van

1

para casos existe la object_mapper(), por lo que:

from sqlalchemy.orm.base import object_mapper 

def is_mapped(obj): 
    try: 
     object_mapper(obj) 
    except UnmappedInstanceError: 
     return False 
    return True 

las utilidades asignador completas están documentados aquí: http://docs.sqlalchemy.org/en/rel_1_0/orm/mapping_api.html

Sólo una consideración: ya que los errores específicos son criados por SQLAlchemy (UnmappedClassError de calsses y UnmappedInstanceError por ejemplo) ¿por qué no detectarlos en lugar de una excepción genérica? ;)

Cuestiones relacionadas