如何使用sqlalchemy方言类型的literal_processor方法?
这个方法在类型上的用法不是很明显。我看过 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.