MySQL和SQLAlchemy整型转移

2024-04-18 13:32:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{pr2}$

其中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实际上实现了inter-DIV:操作符DIV。在

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

SELECT * FROM Region where region_code DIV 100 = 11;


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


Tags: 方法程序div过滤器prefixsessionmysqlcode
2条回答

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

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

^{pr2}$

相关问题 更多 >