我有一个SQLite3文件数据库,其中每行包含一个大小值和一个SHA256值。
以下SQL查询通过返回Size和SHA256_1024列条目中具有重复项的所有行来查找重复文件。
SELECT A.*
FROM Files A
INNER JOIN (SELECT Size, SHA256_1024
FROM Files
GROUP BY Size, SHA256_1024
HAVING COUNT(*) > 1)p B
ON A.Size = B.Size AND A.SHA256_1024 = B.SHA256_1024
以下计算重复文件的数量:
SELECT COUNT(*) FROM
(
SELECT A.*
FROM Files A
INNER JOIN (SELECT Size, SHA256_1024
FROM Files
GROUP BY Size, SHA256_1024
HAVING COUNT(*) > 1) B
ON A.Size = B.Size AND A.SHA256_1024 = B.SHA256_1024) x
我发现很难在SQLAlchemy中实现内部联接和重复检测功能,并且我已经阅读了Query()的文档。文档中有许多用于过滤值的示例,但我没有找到任何显示如何比较列值Size和SHA256_1024的重复值,如SQL表单中所做的那样。
class FO(Base):
__tablename__ = 'Files'
Id = Column(Integer, primary_key=True)
File = Column(String())
Size = Column(Integer)
MD5_1024 = Column(String())
engine = create_engine('sqlite:///FileRel.db')
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
session.query(FO) #??? Lots more needed: .join .having, etc.
答案 0 :(得分:0)
您可以创建子查询
from sqlalchemy import func, and_
B = session.query(FO.Size, FO.MD5_1024).group_by(FO.Size, FO.MD5_1024).having(func.count() > 1).subquery()
然后加入
query = session.query(FO).join(B, and_(FO.Size == B.c.Size, FO.MD5_1024 == B.c.MD5_1024))
并获得计数
query.count()