Я использую 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)
Кто-нибудь может сказать мне, почему?
ORM SQLAlchemy полагается на обнаружение событий, чтобы определить, когда некоторые данные изменились, и, следовательно, когда данные нужно очистить. в этом случае вы изменяете значение массива Python на месте, которое по умолчанию не производит никаких событий. Для этого вам нужно использовать изменяемое расширение вместе с типом ARRAY (а также подкласс list
который отправляет эти события), чтобы изменения отправлялись как события, связанные с родительским объектом SessionLog
.