1

我有一个表,其中包含一个名为region_codewithInteger作为其数据类型的列。在我的 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;


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

4

2 回答 2

3

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

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)
于 2013-01-28T13:20:40.753 回答
0

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

于 2013-01-28T13:20:06.407 回答