SQLAlchemy обновление массива PostgreSQL с использованием слияния не работает

1

Я использую SQLAlchemy для доступа к базе данных PostgreSQL, и я определил объект следующим образом:

class SessionLog(Base):
    __tablename__ = 'session_log'

    id = Column(Integer, primary_key=True)
    recordFile = Column('record_file', String(128))
    appSrcPorts = Column('app_src_ports', ARRAY(Integer))
    info5 = Column('info5', String(100))

и я выбираю и обновляю таблицу session_log следующим образом:

session = Session()
sessionLog = session.query(SessionLog).filter_by(id=sessionLogId).first()
sessionLog.appSrcPorts.append(1)
session.merge(sessionLog)
session.commit()

Но странно, что столбец "app_src_ports" не обновляется после того, как я вызвал merge() и commit(). И я нахожу уродливый способ заставить его работать, прежде чем добавить строку append():

sessionLog.appSrcPorts = list(sessionLog.appSrcPorts)

Кто-нибудь может сказать мне, почему?

  • 0
    ваше решение (sessionLog.appSrcPorts = list (sessionLog.appSrcPorts), чтобы сделать его списком, работающим как шарм :)
Теги:
sqlalchemy

1 ответ

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

ORM SQLAlchemy полагается на обнаружение событий, чтобы определить, когда некоторые данные изменились, и, следовательно, когда данные нужно очистить. в этом случае вы изменяете значение массива Python на месте, которое по умолчанию не производит никаких событий. Для этого вам нужно использовать изменяемое расширение вместе с типом ARRAY (а также подкласс list который отправляет эти события), чтобы изменения отправлялись как события, связанные с родительским объектом SessionLog.

  • 0
    Как вы думаете, это ошибка SQLAlchemy?
  • 0
    ну, у нас должна быть реализация «MutableList», готовая к использованию в sqlalchemy.ext.mutable, чего у нас сейчас нет (только MutableDict). Кроме того, ORM может представить систему, с помощью которой типы могут рекламировать свою «изменяемую» версию, уменьшая тем самым количество шаблонов, чтобы использовать изменяемый тип для стандартных случаев, таких как ARRAY. Но оба они будут улучшениями, мы не называем эти ошибки.
Показать ещё 1 комментарий

Ещё вопросы

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