参考:https://stackoverflow.com/questions/54127109/updating-a-postgresql-array-field-in-sqlalchemy
1. 举例
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy import create_engine, Column, Integer, update, text
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class TestTable(Base):
__tablename__ = 'test_table'
id = Column(Integer, primary_key=True)
tags = Column(ARRAY(Integer), nullable=False)
engine = create_engine('postgresql://postgres')
Base.metadata.create_all(bind=engine)
DBSession = scoped_session(sessionmaker())
DBSession.configure(bind=engine)
DBSession.bulk_insert_mappings(
TestTable,
({'id': i, 'tags': [i // 4]} for i in range(1, 11))
)
DBSession.execute(
update(
TestTable
).where(
TestTable.tags.contains((1,))
).values(tags=text(f'array_append({TestTable.tags.name}, :tag)')),
{'tag': 100}
)
DBSession.commit()
2. 实例
session.execute(
update(
models.PeopleFrame
).where(
models.PeopleFrame.id == pf.id
).values(frames=text(f'array_append({models.PeopleFrame.frames.name}, :frame)')),
{"frame": info}
)
session.commit()
注意:需要更新的字段和参数名不能一样,不然编译出来的 sql 语句会出错。例如需要更新的字段是 frames
,那么后面的参数就不能是 :frmaes
,而应该是其它的,例如 :abc
或者 :frame
之类的。
3. Flask 使用 sqlalchemy 打印 sql 语句
app.config['SQLALCHEMY_ECHO'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = dburl
db = SQLAlchemy(app)
4. 另外一个叫 Mutable
的 sqlalchemy
的扩展好像也可以做到
来源: - https://stackoverflow.com/questions/20673193/sqlalchemy-update-postgresql-array-using-merge-not-work - https://docs.sqlalchemy.org/en/20/orm/extensions/mutable.html