sqlalchemy postgresql update array_append

创建日期: 2023-08-30 20:19 | 作者: 风波 | 浏览次数: 18 | 分类: SQLAlchemy

参考: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. 另外一个叫 Mutablesqlalchemy 的扩展好像也可以做到

来源: - https://stackoverflow.com/questions/20673193/sqlalchemy-update-postgresql-array-using-merge-not-work - https://docs.sqlalchemy.org/en/20/orm/extensions/mutable.html

18 浏览
17 爬虫
0 评论