I based my code on the Michaeil Bayer's answer to this Stack Overflow 
question  
<http://stackoverflow.com/questions/18858291/values-clause-in-sqlalchemy>. 
I extended it a little so it takes into account NULLs and ARRAY for 
Postgresql.

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

Everything worked fine until it turned out I couldn't insert values with 
"%"-sign to this VALUES clause - they get inlined in a resulting statement 
and this seems to cause binding problems

I guess if instead of render_literal_value() we used bindparam() we could 
avoid such an error. But Everything under @compiles should return plain 
text, am I right? 


How could I amend this to get a query which contains bind parfms along with 
it?

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to