python sqlalchemy 不同的列值

标签 python sqlalchemy

我的 SQLite 数据库中有 6 个表,每个表有 6 列(Date、user、NormalA、specialA、contact、remarks)和 1000 多行。

我如何使用 sqlalchemy 对日期列进行排序以查找重复日期并删除该行?

最佳答案

假设这是您的模型:

class MyTable(Base):
    __tablename__ = 'my_table'
    id = Column(Integer, primary_key=True)
    date = Column(DateTime)
    user = Column(String)
    # do not really care of columns other than `id` and `date`
    # important here is the fact that `id` is a PK

以下是删除数据的两种方法:

  1. 找到重复项,将它们标记为删除并提交事务
  2. 创建一个将直接对数据库执行删除的 SQL 查询。

对于他们两个,将使用辅助子查询:

# helper subquery: find first row (by primary key) for each unique date
subq = (
    session.query(MyTable.date, func.min(MyTable.id).label("min_id"))
    .group_by(MyTable.date)
) .subquery('date_min_id')

选项 1:查找重复项,将它们标记为删除并提交事务

# query to find all duplicates
q_duplicates = (
    session
    .query(MyTable)
    .join(subq, and_(
        MyTable.date == subq.c.date,
        MyTable.id != subq.c.min_id)
    )
)

for x in q_duplicates:
    print("Will delete %s" % x)
    session.delete(x)
session.commit()

选项 2:创建将直接对数据库执行删除的单个 SQL 查询

sq = (
    session
    .query(MyTable.id)
    .join(subq, and_(
        MyTable.date == subq.c.date,
        MyTable.id != subq.c.min_id)
    )
).subquery("subq")

dq = (
    session
    .query(MyTable)
    .filter(MyTable.id.in_(sq))
).delete(synchronize_session=False)

关于python sqlalchemy 不同的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35991012/

相关文章:

python - SQLAlchemy 一对一关系创建多行

python - 读取从机,读写主机设置

python - sqlalchemy 中的多对多。如果标记已存在,则防止 SQLAlchemy 插入表中

python - 如何将 pandas Series 的 "rows"转换为 DataFrame 的列?

python-2.7 - Flask WTForms 表单无法验证

python - SQLAlchemy @property 在 Marshmallow 中使用 dump_only 导致 'Unknown Field' 错误

python空参数

python - Qt 的多处理适用于 Windows 但不适用于 Linux

python - Python 中的 Tukey 五数总结

Python Mysql 在不同的表上选择相同的值