Actually, using the session.connection().execute did help!

Also, I think there is an option of creating a TextClause subclass with a
different search regex that, for example, matches nothing. But it's a bit
of an overkill, IMO.


On Fri, Nov 29, 2013 at 10:41 PM, Michael Bayer <[email protected]>wrote:

>
> On Nov 22, 2013, at 2:08 PM, Michael Bayer <[email protected]>
> wrote:
>
>
> On Nov 22, 2013, at 1:11 PM, Ivan Kalinin <[email protected]> wrote:
>
> Hello there, fellow developers!
>
> We've recently run into a terrible problem.
>
> A small tool uses SQLAlchemy to execute statements read from a text file
> against a database.
>
> The trouble comes when that pre-defined statement has a colon symbol in
> the field value of a, say, INSERT statement.
>
> Like as follows:
> INSERT INTO my_test_table values (123, ':bar')
>
> Running this statement with a plain session.execute(stmt) (where stmt
> contains a unicode string with full statement) causes a StatementError with
> a message like "A value is required for bind parameter u'bar'"
>
> However, I'm certain that parameter placeholders should not be parsed from
> within string literals.
>
> Is there a way to tell SA that this statement should not be analyzed for
> placeholders?
>
> Thanks in advance for help and advice!
>
>
> the string passed to session.execute() is wrapped with a text() construct,
> which does parse for bound parameters so that they may be type-processed
> and converted to the representation expected by the DBAPI (which is usually
> not the colon style).    This parsing is pretty simplistic and does not
> expect that a quoted value would be directly embedded in the statement.
>  there’s no escaping for those at the moment, so you have to skip the
> text() part here.   To send a raw statement to the DBAPI layer without any
> processing, use the Connection object directly, that is, send
> session.connection().execute(stmt).
>
>
> sorry, I’m partially incorrect here, you should escape out that colon with
> a backslash:
>
> >>> from sqlalchemy import text
> >>> print text("INSERT INTO my_test_table values (123, '\\:bar')")
> INSERT INTO my_test_table values (123, ':bar')
> >>>
>
>
>
>
>
>

-- 
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/groups/opt_out.

Reply via email to