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

1 投票
1 回答
41 浏览
提问于 2025-04-14 18:13

这个方法在类型上的用法不是很明显。我看过 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 数组。

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.

撰写回答