Python 如何解析sqlalchemy中的filter子句

Python 如何解析sqlalchemy中的filter子句,python,sqlalchemy,Python,Sqlalchemy,如何解析子句,作为过滤器方法中的参数提供 运行 过滤器\u子句=记录。开始>='2017-07-17' 打印(过滤条款) 给出一个字符串 records.start>=:开始\u 1 需要一个实值,而不是:start_1,并且该值必须由process_bind_param函数传递。我必须使用哪种方法来获取这样的字符串:records.start>='1500321600.0' 我不认为仅仅用香草炼金术就可以做到这一点。 您可以尝试使用自定义函数,如: import re def represe

如何解析子句,作为过滤器方法中的参数提供

运行

过滤器\u子句=记录。开始>='2017-07-17'

打印(过滤条款)

给出一个字符串

records.start>=:开始\u 1

需要一个实值,而不是:start_1,并且该值必须由process_bind_param函数传递。我必须使用哪种方法来获取这样的字符串:records.start>='1500321600.0'


我不认为仅仅用香草炼金术就可以做到这一点。 您可以尝试使用自定义函数,如:

import re

def represent_filter(expression):
    expression = expression.compile()
    params = expression.params
    prefixed_names = [':' + param for param in params]
    pattern = re.compile('(%s)' % '|'.join(prefixed_names))

    def substitute_param_value(match):
        return params[match.group()[1:]]

    return pattern.sub(substitute_param_value, expression.string)
然后使用它调用
表示过滤器(过滤器子句)
,它将返回
记录。开始>=2017-07-17

您可以使用类似于
repr(str(params[match.group()[1:]])
的内容,而不是
params[match.group()[1:]
,强制expresentation\u filter函数引用替换的值

另一种方法是遍历给定的表达式(在您的例子中,
filters\u子句
是一个
BinaryExpression,也有一元表达式),检查左侧和右侧并构建您自己的表示。如果您只想恢复值(您提供给筛选的日期),它位于
filters\u子句中。对。effective\u value

我想您需要的是:


但是,如果您使用
literal\u binds
,请小心SQL注入。

您在标题(“解析”)中提出的问题与正文(“编译到
records.start>='1500321600.0'
”)中提出的问题不同。你能澄清你的问题吗?英语不是我的母语,请原谅我的错误。我认为“compile”方法是我想要的方法之一。但使用这种方法并没有给我预期的结果。然而,也许我做错了什么。无论如何,我认为你的评论是准确的,只是“编译”了所需的子句值。谢谢你的回答。获取记录是毫无疑问的。开始>='2017-07-17'。这很容易。通过专门为SA自定义类型创建的process_bind_param方法将值“2017-07-17”编译为“1500321600.0”存在一个问题。当我们执行session.query(Record).filter(filters\u子句)时,该方法会自动调用,我不知道如何仅为一个参数(start)调用该方法而不执行整个查询。非常感谢!这正是我想要的!我猜这一定很容易,但找不到解决办法
import re

def represent_filter(expression):
    expression = expression.compile()
    params = expression.params
    prefixed_names = [':' + param for param in params]
    pattern = re.compile('(%s)' % '|'.join(prefixed_names))

    def substitute_param_value(match):
        return params[match.group()[1:]]

    return pattern.sub(substitute_param_value, expression.string)
print(filters_clause.compile(engine, compile_kwargs={"literal_binds": True}))
# records.start >= 1500274800.0