@pcdesign

Какой дампер использовать для Flask sqlalchemy?

rows = db.session.query(User, UserItem).join(UserItem).filter(User.id == 2).all()
print(rows)


Если просто использовать print, то там будет что-то вроде этого:
(<models.User object at 0x7fae4f7d09b0>, <models.UserItem object at 0x7fae4f7d0ac8>)


Чем выводить на экран при дебаге такого рода структуры?
  • Вопрос задан
  • 3056 просмотров
Решения вопроса 2
@sormon
инженер-программист =)
Вам нужно у класса, которым вы описывает сущность, определить метод __repr__:
Пример из документации (docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html):
from sqlalchemy import Column, Integer, String
>>> class User(Base):
...     __tablename__ = 'users'
...
...     id = Column(Integer, primary_key=True)
...     name = Column(String)
...     fullname = Column(String)
...     password = Column(String)
...
...     def __repr__(self):
...        return "<User(name='%s', fullname='%s', password='%s')>" % (
...                             self.name, self.fullname, self.password)


Добавлю сюда из комментариев решение универсального repr для mapper-классов алхимии, чтобы с форматированием:
from sqlalchemy import inspect
...
def __repr__(self):
        mapper = inspect(self).mapper
        ent = []
        for col in mapper.column_attrs:
            ent.append("{0}={1}".format(col.key, getattr(self, col.key)))
        return "<{0}(".format(self.__class__.__name__) + ", ".join(ent) + ")>"

Нужно учесть, что в получаемой строке не будет ассоциаций, т.к. иначе мы можем получить бесконечную рекурсию.
Этим методом можно переопределить метод __repr__ у Base, чтобы не дублировать его для каждого класса.
Ответ написан
xSkyFoXx
@xSkyFoXx
Перегрузите __unicode__ (для py2) или __str__ (для py3) в базовом классе и выводите то, что вам вздумается.
А вообще любая debug tool для питона позволяет посмотреть внутрь самого объекта.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы