2
我基於@ zzzeeek對this question的回答得到了我的代碼。 我擴展了一點,所以它考慮了Postgresql的NULL和ARRAY。如何在自定義編譯表達式中使用bindparam()?
class values(FromClause):
named_with_column = True
def __init__(self, columns, *args, **kw):
self._column_args = columns
self.list = args
self.alias_name = self.name = kw.pop('alias_name', None)
def _populate_column_collection(self):
# self._columns.update((col.name, col) for col in self._column_args)
for c in self._column_args:
c._make_proxy(self, c.name)
@compiles(values)
def compile_values(element, compiler, asfrom=False, **kw):
columns = element.columns
v = "VALUES %s" % ", ".join(
"(%s)" % ", ".join(
((compiler.visit_array(elem)+'::'+str(column.type)) if isinstance(column.type, ARRAY) else
compiler.render_literal_value(elem, column.type))
if elem is not None else compiler.render_literal_value(elem, NULLTYPE)
for elem, column in zip(tup, columns))
for tup in element.list
)
if asfrom:
if element.alias_name:
v = "(%s) AS %s (%s)" % (v, element.alias_name, (", ".join(c.name for c in element.columns)))
else:
v = "(%s)" % v
return v
一切工作正常,直到它變成了我不能用「%」插入值 - 符號這個values子句 - 它們會內聯在聲明結果,這似乎會導致綁定問題
我如果不是render_literal_value()
我們使用bindparam()
我們可以避免這樣的錯誤。但@compiles
下的所有內容都應該返回純文本,對嗎?我怎樣才能修改這個來獲取基於參數的查詢?