手动转义原始SQL中的字符串

1 投票
2 回答
1122 浏览
提问于 2025-04-19 08:12

我有一个原始的SQL语句,需要用SqlAlchemy来执行。这个查询里包含了这些内容:

FROM unnest(array['sku1', 'sku2', 'sku3'])

我手动构建这个查询的时候,发现找不到办法来手动转义每个参数。

我尝试了这样做:

session.execute("... FROM unnest(array[:skus]) ...", {'skus': skus})

但是:

ProgrammingError: (ProgrammingError) a column definition list is required for functions returning "record"
LINE 21:         FROM unnest(array[('sku1', 'sku2', '...
                      ^

2 个回答

0

好的,如果我放一个 list 的商品编号(skus),而不是 tuple,一切都正常:

session.execute("... FROM unnest(:skus) ...", {'skus': ['BA007EWCBD43', 'KA036\'AGHF550', 'KA036ACBK873']})

这会生成:

FROM unnest(['BA007EWCBD43', "KA036'AGHF550", 'KA036ACBK873'])

不过,对于其他情况,还是需要一个手动处理参数的函数。

2

在Python中,tuple(元组)是用来适配Postgresql中的record(记录)的,而list(列表)则是用来适配array(数组)的。这就是为什么在这种情况下,元组是不合适的。

但是你在你自己的回答中提到的那个方法是有效的,这里并不是这样:

select unnest(['BA007EWCBD43', "KA036'AGHF550", 'KA036ACBK873']);
ERROR:  syntax error at or near "["
LINE 1: select unnest(['BA007EWCBD43', "KA036'AGHF550", 'KA036ACBK87...

或者你是指

FROM unnest(ARRAY['BA007EWCBD43', "KA036'AGHF550", 'KA036ACBK873'])

参数不应该手动转义,应该交给驱动程序来处理。

撰写回答