gpt4 book ai didi

python - WHERE 子句中的 MySQL 和 SQLAlchemy 整数转移

转载 作者:行者123 更新时间:2023-11-29 05:31:10 30 4
gpt4 key购买 nike

我有一个表,其中包含一个名为 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而不是 /运算符(operator)?这可能吗?还是使用 native 查询的唯一解决方法?

最佳答案

幸运的是,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)

关于python - WHERE 子句中的 MySQL 和 SQLAlchemy 整数转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14562690/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com