【问题标题】:How to delete last row using SQLAlchemy?如何使用 SQLAlchemy 删除最后一行?
【发布时间】:2021-07-19 06:32:53
【问题描述】:

我需要执行下一个查询:

DELETE FROM <table_name>
ORDER BY <column_name> DESC LIMIT 1

我在尝试:

query = session.query(MyTable)
query.order_by(MyTable.my_column.desc()).limit(1).delete()

error: Can't call Query.update() or Query.delete() when order_by() has been called

我目前的方式(我想摆脱循环):

query = session.query(MyTable)
for item in query.order_by(MyTable.my_column.desc()).limit(1).all():
    query.filter(MyTable.id == item.id).delete()

【问题讨论】:

  • 您可以使用 select().order_by() 来检索要删除的行的主键,然后使用它来删除该行。
  • 查询对象没有属性'select'
  • MyTable 是 ORM 类吗?
  • 是的,MyTable 是一个 ORM 类

标签: python sql sqlalchemy orm


【解决方案1】:

由于您正在处理 ORM 对象,因此您只需检索“最后一个”项目,然后将其删除:

# ORM class for demo
class Team(Base):
    __tablename__ = "team"
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    rank = Column(Integer)

    def __repr__(self):
        return f"<Team(id={self.id}, name='{self.name}', rank={self.rank})>"


Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)

# test data
with Session(engine) as session:
    session.add_all(
        [
            Team(name="Oilers", rank=3),
            Team(name="Flames", rank=1),
            Team(name="Canucks", rank=2),
        ]
    )
    session.commit()

# demo code
with Session(engine) as session:
    last_place_team = session.execute(
        select(Team).order_by(Team.rank.desc()).limit(1)
    ).scalar()
    print(last_place_team)  # <Team(id=1, name='Oilers', rank=3)>
    session.delete(last_place_team)
    session.commit()
    """SQL code:
    2021-04-25 14:08:16,251 INFO sqlalchemy.engine.Engine DELETE FROM team WHERE team.id = ?
    2021-04-25 14:08:16,252 INFO sqlalchemy.engine.Engine [generated in 0.00073s] (1,)
    """

【讨论】:

    【解决方案2】:

    先获取最后一行

    使用 MySQL

    SELECT * FROM Table ORDER BY ID DESC LIMIT 1
    

    使用 SQL

    SELECT TOP 1 * FROM Table ORDER BY ID DESC
    

    然后从第一个查询中获取 ID 或这一行并运行此查询

    DELETE FROM table_name WHERE id=the_id_that_you_get_from_first_query
    

    ============ 更新 ===========

    让我们从获取最后一行开始:

    obj = session.query(ObjectRes).order_by(ObjectRes.id.desc()).first()
    

    删除

    Obj.query.filter(table.id == obj['id']).delete()
    

    【讨论】:

    • 您的解决方案解决了我的问题。是否可以通过一个 SQLAlchemy 查询完成任务?
    • 任务是什么?如果有帮助,请投票给答案,所以如果其他人提出相同的问题,将很快得到答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2018-02-23
    • 2011-06-22
    • 2019-10-24
    • 2010-11-03
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多