具有内部联接的SQLAlchemy查询具有重复的列值标准/筛选器

时间:2016-03-14 11:36:33

标签: python sqlalchemy

我有一个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.

1 个答案:

答案 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()