SQLAlchemy query db с фильтром для всех таблиц - PullRequest
0 голосов
/ 27 мая 2020

У меня есть модели SQLAlchemy поверх MySQL db. Мне нужно запросить почти все модели (строковые или текстовые поля) и найти все, что содержит определенную подстроку c. А также примените обычную фильтрацию, например object_type = type1. Например:

class Model1(Model):
    name = Column(String(100), nullable=False, unique=True)
    version = Column(String(100))
    description = Column(String(100))
    updated_at = Column(TIMESTAMP(timezone=True))
    # other fields

class Model2(Model):
    name = Column(String(100), nullable=False, unique=True)
    version = Column(String(100))
    description = Column(String(100))
    updated_at = Column(TIMESTAMP(timezone=True))
    # other fields

class Model3(Model):
    name = Column(String(100), nullable=False, unique=True)
    version = Column(String(100))
    description = Column(String(100))
    updated_at = Column(TIMESTAMP(timezone=True))
    # other fields

А затем запросите что-то вроде:

db.query(
    Model1.any_of_all_columns.contains('sub_string') or
    Model2.any_of_all_columns.contains('sub_string') or
    Model3.any_of_all_columns.contains('sub_string')
).all()

Можно ли создать такой запрос ORM в одном SQL к базе данных и динамически добавить Model ( таблица) имена и столбцы?

1 Ответ

0 голосов
/ 29 мая 2020

Для применения общей фильтрации для всех столбцов вы можете подписаться на sqlachemy events следующим образом:

@event.listens_for(Query, "before_compile", retval=True)
def before_compile(query):

for ent in query.column_descriptions:
    entity = ent['entity']
    if entity is None:
        continue


    inspect_entity_for_mapper = inspect(ent['entity'])
    mapper = getattr(inspect_entity_for_mapper, 'mapper', None)

    if mapper and has_tenant_id:

        query = query.enable_assertions(False).filter(
            ent['entity’].object == object)

return query

Эта функция будет вызываться всякий раз, когда вы выполняете Model.query () и добавить фильтр для вашего объекта.

...