如何使用sqlalchemy方言类型的方法literal_processor?

问题描述 投票:0回答:1

此方法对于类型的用法并不明显。我已阅读

sqlalchemy
文档,其中据说该方法用于直接从文字值呈现查询部分。但我不明白什么时候可能会调用类型。

例如,让我们以

clickhouse_sqlalchemy.types.Array
为例。它的方法看起来是这样的:

def literal_processor(self, dialect):
    item_processor = self.item_type_impl.literal_processor(dialect)

    def process(value):
        processed_value = []
        for x in value:
            if item_processor:
                x = item_processor(x)
            processed_value.append(x)
        return '[' + ', '.join(processed_value) + ']'
    return process

可以明显看出,该方法返回一个渲染通常的 ClickHouse 数组的函数,如

[1, 2, 3]
。但是我怎样才能在查询中实现这一点呢?我仅使用
Array
作为转换类型,例如
sa.cast(sa.func.array(1, 2, 3), Array(String))
,并且无法以任何其他方式使用它来在查询渲染中创建本机 ClickHouse 数组。

python sqlalchemy clickhouse
1个回答
0
投票

我不确定我是否理解这个问题,但你总是可以将一个“看起来像”数组的字符串转换为 ClickHouse 的数组,如下所示:

clickhouse-cloud :) select '[1, 2, 3]'::String as col_str, toTypeName(col_str) as col_str_type, col_str::Array(UInt32) as col_str_cast_array_uint32, toTypeName(col_str_cast_array_uint32) as col_array_type

SELECT
    CAST('[1, 2, 3]', 'String') AS col_str,
    toTypeName(col_str) AS col_str_type,
    CAST(col_str, 'Array(UInt32)') AS col_str_cast_array_uint32,
    toTypeName(col_str_cast_array_uint32) AS col_array_type

Query id: 200abba4-2fd1-4cc3-9efe-529765c26a09

┌─col_str───┬─col_str_type─┬─col_str_cast_array_uint32─┬─col_array_type─┐
│ [1, 2, 3] │ String       │ [1,2,3]                   │ Array(UInt32)  │
└───────────┴──────────────┴───────────────────────────┴────────────────┘

1 row in set. Elapsed: 0.001 sec.
© www.soinside.com 2019 - 2024. All rights reserved.