我有一个表,其中包含一个名为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
而不是/
运算符?这可能吗?或者是使用本机查询的唯一解决方法?
为什么不在python脚本中单独执行除法操作,将结果保存到变量中,然后在查询中传递变量而不是操作?在
幸运的是SQLAlchemy允许自定义运算符。有一些简单的方法(在查询中简单地指定)或更复杂的方法(完全定义新操作符并使其具有多数据库意识)。所以这取决于你在找什么。在
http://docs.sqlalchemy.org/en/latest/core/custom_types.html?highlight=operators#redefining-and-creating-new-operators
还有奇特的方式:
http://docs.sqlalchemy.org/en/rel_0_8/core/types.html#types-operators
^{pr2}$相关问题 更多 >
编程相关推荐