2015-07-30 7 views
3

Я работаю на огромной базе кода, который делает все взаимодействия с базой данных следующим образом:Колба-SQLAlchemy: Автоматический фильтр для «удалено» записей

ExampleClass.query.all() 

Если ExampleClass наследует свойства db.Model и наш BaseEntity определен следующим образом:

class BaseEntity(object): 
    deleted = db.Column(db.DateTime, default=None, nullable=True) 
    ... # more columns 

Теперь, когда я запроса ExampleClass для всех записей, ExampleClass.query.all(), я хочу записи, где удаляется поле устанавливается на дату, иначе запись удаляется из системы должны быть исключены. Было бы идеально, если бы мне не пришлось обновлять всю кодовую базу простым .filter(deleted != None). Мое решение для этого заключалось в добавлении фильтра событий SQLAlchemy: before_compile. Документация дала мне именно то, что искал:

@event.listens_for(Query, "before_compile", retval=True) 
def no_deleted(query): 
    for desc in query.column_descriptions: 
     if desc['type'] is ExampleClass: 
      entity = desc['expr'] 
      query = query.filter(entity.deleted == False) 
    return query 

Однако я не могу получить эту работу, последняя ошибка я застрял на это следующим образом:

AttributeError: 'Mapper' object has no attribute 'deleted' 

версий библиотек, которые я использую являются: Колба == 0.10.1, Колба-SQLAlchemy == 1,0, SQLAlchemy == 1.0.6

ответ

0

очевидный и простой подход, чтобы сделать это (проверено и работает для меня) будет:

class BaseEntity(db.Model): 
    deleted = db.Column(db.DateTime, default=None, nullable=True) 

BaseEntity.query = BaseEntity.query.filter(BaseEntity.deleted == None) 

Тем не менее, другие разработчики могли бы ожидать, что BaseEntity.query начинается с чистым объектом запроса, так что вы можете рассмотреть возможность использования другого свойства класса, чем query:

class BaseEntity(db.Model): 
    deleted = db.Column(db.DateTime, default=None, nullable=True) 

BaseEntity.non_deleted = BaseEntity.query.filter(BaseQuery.deleted == None) 

# and then use it like … 
BaseEntity.non_deleted.all() 
Смежные вопросы