我的 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
以下是删除数据的两种方法:
- 找到重复项,将它们标记为删除并提交事务
- 创建一个将直接对数据库执行删除的 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/