2011-10-05 15 views
6

Voglio sapere come sapeva, dato un oggetto, se si tratta di un esempio di un modello di SQLAlchemy mappato.Controllare se l'oggetto è un'istanza modello sqlalchemy

Normalmente, vorrei utilizzare isinstance (obj, DeclarativeBase). Tuttavia, in questo scenario, non ho la classe DeclarativeBase disponibile (poiché si trova in un progetto di dipendenza).

vorrei sapere qual è la migliore pratica in questo 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

fornire qualche informazione in più! – shahjapan

risposta

4

È possibile utilizzare class_mapper() e intercettare l'eccezione.
Oppure si potrebbe usare _is_mapped_class, ma idealmente non si dovrebbe in quanto non è un metodo pubblico.

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

Grazie van. La mia domanda iniziale riguardava l'istanza dell'oggetto e non la classe. Devo cambiare il tuo codice in un object_mapper, invece? – Ahmed

+0

È sempre possibile ottenere la classe di un'istanza; 'Tipo (esempio)' – SingleNegationElimination

+0

Certo, è possibile utilizzare l'object_mapper. O come indicato sopra, ottieni il tipo. Sta a te... – van

1

per le istanze c'è il object_mapper(), quindi:

from sqlalchemy.orm.base import object_mapper 

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

le utilità mapper completi sono documentati qui: http://docs.sqlalchemy.org/en/rel_1_0/orm/mapping_api.html

Solo una considerazione: dal momento che gli errori specifici sono sollevate da SQLAlchemy (UnmappedClassError per calsses e UnmappedInstanceError per le istanze) perché non catturarli piuttosto che un'eccezione generica? ;)