【问题标题】:MySQL and SQLAlchemy integer diversion in WHERE clauseWHERE 子句中的 MySQL 和 SQLAlchemy 整数转移
【发布时间】:2013-01-11 19:55:27
【问题描述】:

我有一个表,其中包含一个名为region_code 的列,其数据类型为Integer。在我的 Python 程序中,我有这一行:

region = session.query(Region).filter(Region.region_code/100 == region_prefix).one()

这里的重要部分是选择的过滤器方法

Region.region_code/100 == region_prefix

其中 region_code 是表中的整数列,region_prefix 变量保存一个整数值

region_code 是表中的整数列,其中包含 1199, 1200, 1300, 1499 等值,而 region_prefix 变量(来自程序)包含 11, 12, 13, 14 等整数值。

我现在想要使用此过滤器选项实现的是对 region_code 执行整数除法(因此将所有内容都删除到小数位后面),以便能够将其与 region_prefix 进行比较。


示例:

region_prefix = 11

假设Region表中存在一个带有

的条目
region_code = 1199

过滤器中的计算应该是这样的

1199 / 100 = 11

因此,有了这个结果,我可以过滤region_prefix (11=11)这适用于 MSSQL (Microsoft)。


不幸的是(就我而言)MySQL 除法运算符/ 不进行整数除法。所以1199/100 的结果将是11.99,所以我的查询不会在数据库中找到合适的条目(因为 11.99 != 11)。 然而 MySQL 实际上已经实现了除法:DIV 操作符。

所以下面的 SQL 查询对我来说很好用:

SELECT * FROM Region where region_code DIV 100 = 11;


所以我的问题是: 如何让 SQLAlchemy filter 方法使用 DIV 而不是 / 运算符?这可能吗?还是使用本机查询的唯一解决方法?

【问题讨论】:

    标签: python mysql sqlalchemy


    【解决方案1】:

    幸运的是,SQLAlchemy 允许自定义运算符。有一些简单的方法可以做到这一点(只需在查询中指定)或更复杂的版本(完全定义 new 运算符并使其具有多数据库意识)。所以这取决于你在寻找什么。

    http://docs.sqlalchemy.org/en/latest/core/custom_types.html?highlight=operators#redefining-and-creating-new-operators

    region = (session
        .query(Region)
        .filter(Region.region_code.op('div')(region_prefix))
        .one()
    )
    

    还有别致的方式:

    http://docs.sqlalchemy.org/en/rel_0_8/core/types.html#types-operators

    from sqlalchemy import Integer
    
    class DivisibleInteger(Integer):
        class comparator_factory(Integer.Comparator):
            def div(self, other):
                return self.op('div')(other)
    

    【讨论】:

    • 太棒了。正是我想要的。现在我要看看能否让它在 MySQL 和 MSSQL 上运行。
    • @cyphorious:我不完全确定如何使用运算符立即执行此操作,但这里有一个很好的自定义类型示例:docs.sqlalchemy.org/en/rel_0_8/core/…
    • 我还是不知道该怎么做,什么是'div'?如何将其实现为我的自定义运算符?我不能直接在我的 python 项目中使用它。而且我在文档中找不到任何有用的信息。
    • @Versus:文档链接已被意外更改,但这应该对您有所帮助:docs.sqlalchemy.org/en/latest/core/…
    【解决方案2】:

    为什么不在你的python脚本中单独执行除法运算,将结果保存到一个变量中,然后在你的查询中传递变量而不是运算?

    【讨论】:

    • 当然可以(尽管我必须从数据库中预加载数据)。但是,如果有一些我不知道的 SQLAlchemy 魔法,这不是我的问题的答案。我已经有一个不同的算法来拥有一个工作应用程序,但这个问题的目的是了解更多关于 SQLAlchemy 的信息。
    猜你喜欢
    • 2011-09-06
    • 2014-09-28
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多