Проверьте, является ли объект экземпляром модели sqlalchemy - PullRequest
7 голосов
/ 05 октября 2011

Я хочу знать, как узнать, заданный объект, является ли он экземпляром модели с отображением sqlalchemy.

Обычно я бы использовал isinstance (obj, DeclarativeBase). Однако в этом сценарии у меня нет доступного используемого класса DeclarativeBase (поскольку он находится в проекте зависимостей).

Я хотел бы знать, какова наилучшая практика в этом случае.

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?

Ответы [ 2 ]

5 голосов
/ 05 октября 2011

Вы можете использовать class_mapper () и перехватить исключение.
Или вы можете использовать _is_mapped_class, но в идеале вы не должны, поскольку это не публичный метод.

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))
1 голос
/ 18 января 2016

для экземпляров есть object_mapper(), поэтому:

from sqlalchemy.orm.base import object_mapper

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

Полные утилиты картографирования описаны здесь: http://docs.sqlalchemy.org/en/rel_1_0/orm/mapping_api.html

Просто соображение: поскольку SQLAlchemy вызывает конкретные ошибки (UnmappedClassError для calsses и UnmappedInstanceError для экземпляров), почему бы не перехватить их, а не общее исключение? ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...