手动转义原始SQL中的字符串
我有一个原始的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'])
参数不应该手动转义,应该交给驱动程序来处理。