Python 如何使用SQLAlchemy进行表采样?

Python 如何使用SQLAlchemy进行表采样?,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,目前是否可以在SQLAlchemy中的ORM查询中对某些表执行TABLESAMPLE 我能找到的最接近的是,但这会将后缀放在查询的末尾,而不是表的末尾 如果有帮助,这是我的用例: 我的查询当前为: query = session.query(A).options( subqueryload(A.rel1), subqueryload(A.rel2) ).filter(A.id >= min_id, A.id < max_id, [...]) query=sessi

目前是否可以在SQLAlchemy中的ORM查询中对某些表执行
TABLESAMPLE

我能找到的最接近的是,但这会将后缀放在查询的末尾,而不是表的末尾

如果有帮助,这是我的用例:

我的查询当前为:

query = session.query(A).options(
    subqueryload(A.rel1),
    subqueryload(A.rel2)
).filter(A.id >= min_id, A.id < max_id, [...]) 
query=session.query(A).options(
亚克勒罗德(A.rel1),
亚克勒罗德(A.rel2)
).filter(A.id>=min\u id,A.id
我想在表
A
上添加
TABLESAMPLE
,这样我就可以有效地只加载
A
的子集及其对应关系,并使用一些过滤器。我正在使用PostgreSQL 9.5作为我的数据库。

更新 对于可选择项
FromClause
元素有一个方法(想想
Table
s),函数可以与所有可选择项一起使用,例如声明性模型类:

from sqlalchemy import tablesample, func
from sqlalchemy.orm import aliased

# Create an alias for A that uses SYSTEM sampling method (default)
a_sampled = aliased(A, tablesample(A, 2.5))

# Create an alias for A that uses BERNOULLI sampling method
a_bernoulli = aliased(A, tablesample(A, func.bernoulli(2.5)))
tablesample(a,…)
中有一点不对称,其中
a
是一个声明性类,返回一个
tablesample
from子句,如果用作模型,则必须使用别名。否则,它的行为类似于
FromClause
,例如,作为模型类基础的


之前 在写这篇文章的时候,似乎有关于支持的问题。由于SQLAlchemy非常简单,下面是一个非常简单的表示例支持实现(阅读:可能不适用于所有用例):

from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql import Alias, FromClause
from sqlalchemy.orm import aliased


class TableSample(Alias):

    __visit_name__ = 'tablesample'

    def __init__(self, selectable, argument=None, method=None,
                 seed=None):
        super(TableSample, self).__init__(selectable)
        self.method = method
        self.argument = argument
        self.seed = seed 


def tablesample(element, argument=None, method=None, seed=None):
    if isinstance(element, FromClause):
        return TableSample(element, argument=argument, method=method, seed=seed)
    else:
        return aliased(element, TableSample(element.__table__,
            argument=argument, method=method, seed=seed))


@compiles(TableSample)
def compile_tablesample(element, compiler, **kwargs):
    s = "%s TABLESAMPLE %s(%s)" % (
        compiler.visit_alias(element, **kwargs),
        element.method or 'SYSTEM',
        element.argument)

    if element.seed:
        s += " REPEATABLE (%s)" % compiler.process(element.seed, **kwargs)

    return s
为方便起见,
参数
目前应该只是一个浮点数,表示0到100之间的百分比,尽管PostgreSQL可以接受任何实值表达式。另一方面,
seed
是编译的,因此必须使用或类似的方法包装文本python值

其使用方式应类似于:

a_sampled=tablesample(a,2.5)
query=session.query(a_)。选项(
subqueryload(a_sampled.rel1),
子QueryLoad(a_sampled.rel2)
).filter(a_sampled.id>=min_id,a_sampled.id
也感谢您编写示例代码!我对一个指针很满意,这超出了预期。
a_sampled = tablesample(A, 2.5)

query = session.query(a_sampled).options(
    subqueryload(a_sampled.rel1),
    subqueryload(a_sampled.rel2)
).filter(a_sampled.id >= min_id, a_sampled.id < max_id, [...])