SQLAlchemy Query Dynamic Field

1

У меня есть таблица со многими столбцами -

class Dummy(object):
    __tablename__ = 'dummies'
    c1 = Column(Integer)
    c2 = Column(Integer)
    c3 = Column(Integer)
    ...
    cN = Column(Integer)

Можно ли запросить все столбцы отдельно, не указывая каждое имя столбца вручную? -

for i in range(1, N):
    c_name = 'c%d' % i
    dummy = DBSession().query(Dummy).filter_by(???=0).first()

Благодарю.

Теги:
database
sqlalchemy

1 ответ

3
Лучший ответ

Вы можете перебирать столбцы в таблице. Во-первых, таблица:

from sqlalchemy.orm.attributes import manager_of_class
dummy_table = manager_of_class(Dummy).mapper.mapped_table

и, наконец, запрос

for col in dummy_table.columns:
    dummy = session.query(Dummy).filter(col == 0).first()

Или, может быть, вы на самом деле генерируете определенный набор столбцов из более сложной функции, чем вы показываете. В этом случае используйте getattr. Нет, действительно.

for i in range(1, N):
    c_name = 'c%d' % i
    dummy = DBSession().query(Dummy).filter(getattr(Dummy, c_name) == 0).first()
  • 0
    Наличие этого шаблона является признаком того, что вам может не хватить столбцов. лучше добавить еще. Серьезно, этот антипаттерн указывает на то, что вам следует рассмотреть возможность вынести список столбцов в новую таблицу с внешним ключом обратно в таблицу Dummy , значением столбца и, возможно, индексом, чтобы держать элементы в порядке. Это также облегчит запрос.
  • 0
    Спасибо, сэр, я серьезно недооценил гибкость SQLAlchemy и должен был сам протестировать getattr. Что касается дизайна БД, давайте просто скажем, что такая NoSQL-подобная эффективность может быть оправдана в некоторых случаях.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню