如何在SQLAlchemy中使用MySQL的标准差(STD,STDDEV,STDDEV_POP)函数?

时间:2015-07-15 09:21:12

标签: mysql sqlalchemy standard-deviation

我需要通过SQLAlchemy使用MySQL的STD函数,但经过几分钟的搜索后,看起来在SQLAlchemy中没有使用func.<>方法。是不支持,还是我遗漏了什么?

1 个答案:

答案 0 :(得分:0)

在 SQLAlchemy 上编写一些聚合时发现这个问题。

引用 docs

<块引用>

可以为 func 指定任何名称。如果 SQLAlchemy 不知道函数名称,它将完全按原样呈现。对于 SQLAlchemy 知道的常见 SQL 函数,该名称可能会被解释为一个通用函数,该函数将被适当地编译到目标数据库中。

基本上func会生成一个匹配属性“func”的函数。如果它不是 SQLAlchemy 知道的常用函数(如 func.count)。

为了保持任何 ORM 附带的 RDBMS 抽象的优势,我总是建议使用 ANSI functions 将代码与数据库引擎分离。

对于工作示例,您可以添加连接字符串并执行以下代码:

from sqlalchemy.orm import sessionmaker
from sqlalchemy import func, create_engine, Column
from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.types import DateTime, Integer, String

# Add your connection string
engine = create_engine('My Connection String')
Base = declarative_base(engine)

Session = sessionmaker(bind=engine)
db_session = Session()

# Make sure to have a table foo in the db with foo_id, bar, baz columns
class Foo(Base):
    __tablename__ = 'foo'
    __table_args__ = { 'autoload' : True }

query = db_session.query(
    func.count(Foo.bar).label('count_agg'),
    func.avg(Foo.foo_id).label('avg_agg'),
    func.stddev(Foo.foo_id).label('stddev_agg'),
    func.stddev_samp(Foo.foo_id).label('stddev_samp_agg')
)

print(query.statement.compile())

会生成如下SQL

SELECT  count(foo.bar) AS count_agg, 
        avg(foo.foo_id) AS avg_agg, 
        stddev(foo.foo_id) AS stddev_agg, 
        stddev_samp(foo.foo_id) AS stddev_samp_agg
FROM foo