【问题标题】:How to use MySQL's standard deviation (STD, STDDEV, STDDEV_POP) function inside SQLAlchemy?如何在 SQLAlchemy 中使用 MySQL 的标准差(STD、STDDEV、STDDEV_POP)函数?
【发布时间】:2015-07-15 09:21:11
【问题描述】:

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

【问题讨论】:

  • 就像func.STD(...) 一样使用它,sqlachemy 将生成 SQL。 sa.func(...) 充当生成器
  • @van 但我似乎在 SQLAlchemy 中找不到func.STD。你是说它仍然可以工作吗?
  • 是的,这就是我要说的

标签: mysql sqlalchemy standard-deviation


【解决方案1】:

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

引用docs

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多