i have another approach, which may or may not serve you.
All those '?' are bindparams, and one can eventualy get them printed
with their names - and put names where there aren't.
that's what i needed, i guess replacing names with values would be
easy job.
the code is part of tests/convertertest.py of sqlalchemyAggregator,
http://dev.gafol.net/t/aggregator/
or
http://dbcook.svn.sourceforge.net/viewvc/dbcook/trunk/dbcook/misc/aggregator/
class T_mark( unittest.TestCase):
...
def setUp( self):
self.m = MetaData()
#hack for better visibility
def bp( self,bindparam):
if bindparam.value is not None:
return 'const('+repr(bindparam.value)+')'
k = bindparam.key
if k.startswith( Converter._pfx): #my own bindparams
k = k[ len( Converter._pfx):]
return 'BindParam('+k+')'
self.old_bp = DefaultCompiler._truncate_bindparam
DefaultCompiler._truncate_bindparam = bp
def tearDown( self):
DefaultCompiler._truncate_bindparam = self.old_bp
...
str(expression) then does things like
:const(True) AND :BindParam(oid) = movies.id
tags.tabl = :const('movies') AND tags.oid = :BindParam(oid)
there's some more stuff going on there around compatibility with SA
0.3--0.5, but that's core.
ciao
svil
On Wednesday 15 October 2008 13:33:46 King Simon-NFHD78 wrote:
> > -----Original Message-----
> > From: [email protected]
> > [mailto:[EMAIL PROTECTED] On Behalf Of alex bodnaru
> > Sent: 15 October 2008 11:00
> > To: SQLAlchemy
> > Subject: [sqlalchemy] how to print a constructed query with
> > it's parameters?
> >
> >
> > hello friends,
> >
> > in order to debug my code, i wish to print my query sql.
> >
> > it's in the fashion of
> > query =
> > table.query().filter(table.code='XL').filter(table.name.like('
> > %'+q+'%')
> > with unicode parameters.
> >
> > by just printing query, i get the select with ? parameters, but
> > not the additional parameters list, that contains ['XL',
> > %q-value%]. since it doesn't presently work ok, i'd like to print
> > the list as well.
> >
> > thanks in advance,
> > alex
>
> This question comes up a lot. For example, see
> http://groups.google.com/group/sqlalchemy/browse_thread/thread/a060
>2ede8 18f55c7
>
> Firstly, if you use echo=True in your call to create_engine, all
> SQL will be printed to stdout. The parameters will be displayed as
> a list AFTER the SQL is printed.
>
> Eg. (from http://www.sqlalchemy.org/docs/05/ormtutorial.html)
>
> BEGIN
> INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
> ['ed', 'Ed Jones', 'edspassword']
> SELECT users.id AS users_id, users.name AS users_name,
> users.fullname AS users_fullname, users.password AS users_password
> FROM users
> WHERE users.name = ?
> LIMIT 1 OFFSET 0
> ['ed']
>
> You can control the logging more finely using the logging module -
> see
> http://www.sqlalchemy.org/docs/05/dbengine.html#dbengine_logging
> for more details.
>
> The problem is that SQLAlchemy doesn't ever replace those '?'
> characters with the actual parameter values. Those strings are
> passed directly to the DBAPI driver, along with the list of
> parameter values. It is then up to the DBAPI driver how it passes
> the query to the database. (This is why SQLAlchemy is fairly safe
> from SQL Injection attacks).
>
> Hope that helps,
>
> Simon
>
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---