Объясните иллюстрированное поведение, стоящее за диктатом экземпляра sqlalchemy. - PullRequest
0 голосов
/ 31 января 2020

У меня есть функция, которая использует sqlalchemy для вставки данных и возвращает экземпляр, с удалением других подробностей

#in models
class Example(Base):
    __tablename__ = 'exmaple'
    id = Column(Integer, primary_key=True)
    attr_a= Column(String(25))
    attr_b = Column(String(20))

#in a file called core
def insert(session, Model, data):
    try:
        new_entity = Model(**data)
        session.add(new_entity)
        session.commit()
        session.flush()
    except DataError as err:
        print(err)
    return new_entity


def create_entity(entity_key, data):
    session = Session(engine)
    created_entity = core.insert(session, utils.entity_map[entity_key], data)
    print('before getattr',created_entity.__dict__) # the dict only yields the instance_state object i.e. not the actual data fields such as attr_a, attr_b...
    print(getattr(created_entity, 'id')) # id used for this example
    print('after getattr',created_entity.__dict__) # yields all attributes attr_a, attr_b
    session.close()

Предположим, что create_entity вызывается с данными для Пример Модель и пример вставлен. Когда я пытаюсь получить доступ к атрибуту __dict__ экземпляра, он ведет себя по-разному в зависимости от того, вызвал ли я getattr.

  1. Может кто-нибудь объяснить это поведение?
  2. Есть ли способ последовательно получить __dict__, который возвращает полный набор атрибутов данных
  3. В отношении q2 можно положиться на это странное поведение, то есть просто позвонить getattr перед тем доступ к dict?

Примечание. Причина, по которой мне нужен доступ к атрибутам данных после вставки / принятия, заключается в том, что мне нужно возвращать автоматически сгенерированные поля, такие как id, last_updated timestamp ...

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