【问题标题】:How to reproducibly query random rows with SQLAlchemy from PostgreSQL?如何使用 PostgreSQL 中的 SQLAlchemy 可重复地查询随机行?
【发布时间】:2020-03-24 08:04:15
【问题描述】:

我正在尝试使用 SQLAlchemy 从 PostgreSQL 表中伪随机选择行,但我需要使用 seed 来保证查询的可重复性。具体案例是关于提交的出版物,与代码库相关。

This answer 很好地介绍了如何利用以下单行来选择单个随机行

select.order_by(func.random()) # for PostgreSQL, SQLite

此外,可以通过以下方式选择 许多 伪随机行:

select.order_by(func.random()).limit(n)

但是如何确保每次运行上述查询时都选择相同的伪随机行?

【问题讨论】:

    标签: postgresql random sqlalchemy


    【解决方案1】:

    您可以利用setseed(n) postgreSQL 方法。使用sqlalchemyChEMBL 作为我们的示例数据库,完整的解决方案如下所示:

    from sqlalchemy import create_engine, func, select
    
    query = select([MoleculeRecord.molregno]).order_by(func.random()).limit(500)
    SEED = .5  # Change this to any float from -1.0 -> 1.0 to get different query results
    
    e = create_engine("postgres:///chembl_25")
    conn = e.connect()
    conn.execute(f"SELECT setseed({SEED})")
    
    firstQueryResults = [x.molregno for x in conn.execute(query)]
    secondQueryResults = [x.molregno for x in conn.execute(query)]
    
    assert(firstQueryResults == secondQueryResults)
    

    这将返回 500 行随机行,并且每次执行此查询时,这 500 行将始终相同这一不变量。选择不同的随机行,将 SEED 变量更改为不同的值,介于 -1.0 和 1.0 之间。

    【讨论】:

    • 作为 Postgresql 的注释,TABLESAMPLE 子句还支持使用种子来获得可重复的结果。
    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多