[Sqlalchemy-commits] [1090] sqlalchemy/trunk/test: removed the dependency of ANSICompiler on SQLEngi
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-03-04 18:53:48
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1090] sqlalchemy/trunk/test: removed the dependency of ANSICompiler on SQLEngine.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1090</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-04 12:53:35 -0600 (Sat, 04 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>removed the dependency of ANSICompiler on SQLEngine. you can now make ANSICompilers and compile SQL with no engine at all.</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyansisqlpy">sqlalchemy/trunk/lib/sqlalchemy/ansisql.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesfirebirdpy">sqlalchemy/trunk/lib/sqlalchemy/databases/firebird.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesinformation_schemapy">sqlalchemy/trunk/lib/sqlalchemy/databases/information_schema.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesmysqlpy">sqlalchemy/trunk/lib/sqlalchemy/databases/mysql.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesoraclepy">sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasespostgrespy">sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasessqlitepy">sqlalchemy/trunk/lib/sqlalchemy/databases/sqlite.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyenginepy">sqlalchemy/trunk/lib/sqlalchemy/engine.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> <li><a href="#sqlalchemytrunktestselectpy">sqlalchemy/trunk/test/select.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyansisqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ansisql.py (1089 => 1090)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ansisql.py 2006-03-04 17:46:08 UTC (rev 1089) +++ sqlalchemy/trunk/lib/sqlalchemy/ansisql.py 2006-03-04 18:53:35 UTC (rev 1090) </span><span class="lines">@@ -27,7 +27,7 @@ </span><span class="cx"> return ANSISchemaDropper(self, **params) </span><span class="cx"> </span><span class="cx"> def compiler(self, statement, parameters, **kwargs): </span><del>- return ANSICompiler(self, statement, parameters, **kwargs) </del><ins>+ return ANSICompiler(statement, parameters, engine=self, **kwargs) </ins><span class="cx"> </span><span class="cx"> def connect_args(self): </span><span class="cx"> return ([],{}) </span><span class="lines">@@ -37,7 +37,7 @@ </span><span class="cx"> </span><span class="cx"> class ANSICompiler(sql.Compiled): </span><span class="cx"> """default implementation of Compiled, which compiles ClauseElements into ANSI-compliant SQL strings.""" </span><del>- def __init__(self, engine, statement, parameters=None, typemap=None, **kwargs): </del><ins>+ def __init__(self, statement, parameters=None, typemap=None, engine=None, positional=None, paramstyle=None, **kwargs): </ins><span class="cx"> """constructs a new ANSICompiler object. </span><span class="cx"> </span><span class="cx"> engine - SQLEngine to compile against </span><span class="lines">@@ -49,7 +49,7 @@ </span><span class="cx"> key/value pairs when the Compiled is executed, and also may affect the </span><span class="cx"> actual compilation, as in the case of an INSERT where the actual columns </span><span class="cx"> inserted will correspond to the keys present in the parameters.""" </span><del>- sql.Compiled.__init__(self, engine, statement, parameters) </del><ins>+ sql.Compiled.__init__(self, statement, parameters, engine=engine) </ins><span class="cx"> self.binds = {} </span><span class="cx"> self.froms = {} </span><span class="cx"> self.wheres = {} </span><span class="lines">@@ -57,19 +57,31 @@ </span><span class="cx"> self.select_stack = [] </span><span class="cx"> self.typemap = typemap or {} </span><span class="cx"> self.isinsert = False </span><ins>+ self.bindtemplate = ":%s" + if engine is not None: + self.paramstyle = engine.paramstyle + self.positional = engine.positional + else: + self.positional = False + self.paramstyle = 'named' </ins><span class="cx"> </span><span class="cx"> def after_compile(self): </span><del>- if self.engine.positional: </del><ins>+ # this re will search for params like :param + # it has a negative lookbehind for an extra ':' so that it doesnt match + # postgres '::text' tokens + match = r'(?<!:):([\w_]+)' + if self.paramstyle=='pyformat': + self.strings[self.statement] = re.sub(match, lambda m:'%(' + m.group(1) +')s', self.strings[self.statement]) + elif self.positional: </ins><span class="cx"> self.positiontup = [] </span><del>- match = r'%\(([\w_]+)\)s' </del><span class="cx"> params = re.finditer(match, self.strings[self.statement]) </span><span class="cx"> for p in params: </span><span class="cx"> self.positiontup.append(p.group(1)) </span><del>- if self.engine.paramstyle=='qmark': </del><ins>+ if self.paramstyle=='qmark': </ins><span class="cx"> self.strings[self.statement] = re.sub(match, '?', self.strings[self.statement]) </span><del>- elif self.engine.paramstyle=='format': </del><ins>+ elif self.paramstyle=='format': </ins><span class="cx"> self.strings[self.statement] = re.sub(match, '%s', self.strings[self.statement]) </span><del>- elif self.engine.paramstyle=='numeric': </del><ins>+ elif self.paramstyle=='numeric': </ins><span class="cx"> i = [0] </span><span class="cx"> def getnum(x): </span><span class="cx"> i[0] += 1 </span><span class="lines">@@ -104,28 +116,33 @@ </span><span class="cx"> bindparams = {} </span><span class="cx"> bindparams.update(params) </span><span class="cx"> </span><del>- if self.engine.positional: </del><ins>+ if self.positional: </ins><span class="cx"> d = OrderedDict() </span><span class="cx"> for k in self.positiontup: </span><span class="cx"> b = self.binds[k] </span><del>- d[k] = b.typeprocess(b.value, self.engine) </del><ins>+ if self.engine is not None: + d[k] = b.typeprocess(b.value, self.engine) + else: + d[k] = b.value </ins><span class="cx"> else: </span><span class="cx"> d = {} </span><span class="cx"> for b in self.binds.values(): </span><del>- d[b.key] = b.typeprocess(b.value, self.engine) </del><ins>+ if self.engine is not None: + d[b.key] = b.typeprocess(b.value, self.engine) + else: + d[b.key] = b.value </ins><span class="cx"> </span><span class="cx"> for key, value in bindparams.iteritems(): </span><span class="cx"> try: </span><span class="cx"> b = self.binds[key] </span><span class="cx"> except KeyError: </span><span class="cx"> continue </span><del>- d[b.key] = b.typeprocess(value, self.engine) </del><ins>+ if self.engine is not None: + d[b.key] = b.typeprocess(value, self.engine) + else: + d[b.key] = value </ins><span class="cx"> </span><span class="cx"> return d </span><del>- if self.engine.positional: - return d.values() - else: - return d </del><span class="cx"> </span><span class="cx"> def get_named_params(self, parameters): </span><span class="cx"> """given the results of the get_params method, returns the parameters </span><span class="lines">@@ -133,8 +150,7 @@ </span><span class="cx"> same dictionary. For a positional paramstyle, the given parameters are </span><span class="cx"> assumed to be in list format and are converted back to a dictionary. </span><span class="cx"> """ </span><del>-# return parameters - if self.engine.positional: </del><ins>+ if self.positional: </ins><span class="cx"> p = {} </span><span class="cx"> for i in range(0, len(self.positiontup)): </span><span class="cx"> p[self.positiontup[i]] = parameters[i] </span><span class="lines">@@ -231,7 +247,7 @@ </span><span class="cx"> self.strings[bindparam] = self.bindparam_string(key) </span><span class="cx"> </span><span class="cx"> def bindparam_string(self, name): </span><del>- return self.engine.bindtemplate % name </del><ins>+ return self.bindtemplate % name </ins><span class="cx"> </span><span class="cx"> def visit_alias(self, alias): </span><span class="cx"> self.froms[alias] = self.get_from_text(alias.original) + " AS " + alias.name </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasesfirebirdpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/firebird.py (1089 => 1090)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/firebird.py 2006-03-04 17:46:08 UTC (rev 1089) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/firebird.py 2006-03-04 18:53:35 UTC (rev 1090) </span><span class="lines">@@ -102,7 +102,7 @@ </span><span class="cx"> return self.context.last_inserted_ids </span><span class="cx"> </span><span class="cx"> def compiler(self, statement, bindparams, **kwargs): </span><del>- return FBCompiler(self, statement, bindparams, use_ansi=self._use_ansi, **kwargs) </del><ins>+ return FBCompiler(statement, bindparams, engine=self, use_ansi=self._use_ansi, **kwargs) </ins><span class="cx"> </span><span class="cx"> def schemagenerator(self, **params): </span><span class="cx"> return FBSchemaGenerator(self, **params) </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasesinformation_schemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/information_schema.py (1089 => 1090)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/information_schema.py 2006-03-04 17:46:08 UTC (rev 1089) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/information_schema.py 2006-03-04 18:53:35 UTC (rev 1090) </span><span class="lines">@@ -132,7 +132,7 @@ </span><span class="cx"> coltype = coltype(*args) </span><span class="cx"> colargs= [] </span><span class="cx"> if default is not None: </span><del>- colargs.append(PassiveDefault(sql.text(default, escape=False))) </del><ins>+ colargs.append(PassiveDefault(sql.text(default))) </ins><span class="cx"> table.append_item(schema.Column(name, coltype, nullable=nullable, *colargs)) </span><span class="cx"> </span><span class="cx"> s = select([constraints.c.constraint_name, constraints.c.constraint_type, constraints.c.table_name, key_constraints], use_labels=True, from_obj=[constraints.join(column_constraints, column_constraints.c.constraint_name==constraints.c.constraint_name).join(key_constraints, key_constraints.c.constraint_name==column_constraints.c.constraint_name)]) </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasesmysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/mysql.py (1089 => 1090)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/mysql.py 2006-03-04 17:46:08 UTC (rev 1089) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/mysql.py 2006-03-04 18:53:35 UTC (rev 1090) </span><span class="lines">@@ -132,7 +132,7 @@ </span><span class="cx"> return False </span><span class="cx"> </span><span class="cx"> def compiler(self, statement, bindparams, **kwargs): </span><del>- return MySQLCompiler(self, statement, bindparams, **kwargs) </del><ins>+ return MySQLCompiler(statement, bindparams, engine=self, **kwargs) </ins><span class="cx"> </span><span class="cx"> def schemagenerator(self, **params): </span><span class="cx"> return MySQLSchemaGenerator(self, **params) </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasesoraclepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py (1089 => 1090)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-03-04 17:46:08 UTC (rev 1089) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-03-04 18:53:35 UTC (rev 1090) </span><span class="lines">@@ -151,7 +151,7 @@ </span><span class="cx"> </span><span class="cx"> colargs = [] </span><span class="cx"> if default is not None: </span><del>- colargs.append(PassiveDefault(sql.text(default, escape=False))) </del><ins>+ colargs.append(PassiveDefault(sql.text(default))) </ins><span class="cx"> </span><span class="cx"> name = name.lower() </span><span class="cx"> </span><span class="lines">@@ -207,7 +207,7 @@ </span><span class="cx"> def __init__(self, engine, statement, parameters, use_ansi = True, **kwargs): </span><span class="cx"> self._outertable = None </span><span class="cx"> self._use_ansi = use_ansi </span><del>- ansisql.ANSICompiler.__init__(self, engine, statement, parameters, **kwargs) </del><ins>+ ansisql.ANSICompiler.__init__(self, statement, parameters, engine=engine, **kwargs) </ins><span class="cx"> </span><span class="cx"> def visit_join(self, join): </span><span class="cx"> if self._use_ansi: </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasespostgrespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py (1089 => 1090)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py 2006-03-04 17:46:08 UTC (rev 1089) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py 2006-03-04 18:53:35 UTC (rev 1090) </span><span class="lines">@@ -210,7 +210,7 @@ </span><span class="cx"> return sqltypes.adapt_type(typeobj, pg1_colspecs) </span><span class="cx"> </span><span class="cx"> def compiler(self, statement, bindparams, **kwargs): </span><del>- return PGCompiler(self, statement, bindparams, **kwargs) </del><ins>+ return PGCompiler(statement, bindparams, engine=self, **kwargs) </ins><span class="cx"> </span><span class="cx"> def schemagenerator(self, **params): </span><span class="cx"> return PGSchemaGenerator(self, **params) </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasessqlitepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/sqlite.py (1089 => 1090)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/sqlite.py 2006-03-04 17:46:08 UTC (rev 1089) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/sqlite.py 2006-03-04 18:53:35 UTC (rev 1090) </span><span class="lines">@@ -147,7 +147,7 @@ </span><span class="cx"> return ([self.filename], self.opts) </span><span class="cx"> </span><span class="cx"> def compiler(self, statement, bindparams, **kwargs): </span><del>- return SQLiteCompiler(self, statement, bindparams, **kwargs) </del><ins>+ return SQLiteCompiler(statement, bindparams, engine=self, **kwargs) </ins><span class="cx"> </span><span class="cx"> def dbapi(self): </span><span class="cx"> return sqlite </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyenginepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/engine.py (1089 => 1090)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-04 17:46:08 UTC (rev 1089) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-04 18:53:35 UTC (rev 1090) </span><span class="lines">@@ -227,15 +227,12 @@ </span><span class="cx"> self._paramstyle = 'named' </span><span class="cx"> </span><span class="cx"> if self._paramstyle == 'named': </span><del>- self.bindtemplate = ':%s' </del><span class="cx"> self.positional=False </span><span class="cx"> elif self._paramstyle == 'pyformat': </span><del>- self.bindtemplate = "%%(%s)s" </del><span class="cx"> self.positional=False </span><span class="cx"> elif self._paramstyle == 'qmark' or self._paramstyle == 'format' or self._paramstyle == 'numeric': </span><span class="cx"> # for positional, use pyformat internally, ANSICompiler will convert </span><span class="cx"> # to appropriate character upon compilation </span><del>- self.bindtemplate = "%%(%s)s" </del><span class="cx"> self.positional = True </span><span class="cx"> else: </span><span class="cx"> raise DBAPIError("Unsupported paramstyle '%s'" % self._paramstyle) </span><span class="lines">@@ -310,8 +307,7 @@ </span><span class="cx"> instance of this engine's SQLCompiler, compiles the ClauseElement, and returns the </span><span class="cx"> newly compiled object.""" </span><span class="cx"> compiler = self.compiler(statement, parameters, **kwargs) </span><del>- statement.accept_visitor(compiler) - compiler.after_compile() </del><ins>+ compiler.compile() </ins><span class="cx"> return compiler </span><span class="cx"> </span><span class="cx"> def reflecttable(self, table): </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1089 => 1090)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-04 17:46:08 UTC (rev 1089) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-04 18:53:35 UTC (rev 1090) </span><span class="lines">@@ -257,11 +257,9 @@ </span><span class="cx"> object be dependent on the actual values of those bind parameters, even though it may </span><span class="cx"> reference those values as defaults.""" </span><span class="cx"> </span><del>- def __init__(self, engine, statement, parameters): </del><ins>+ def __init__(self, statement, parameters, engine=None): </ins><span class="cx"> """constructs a new Compiled object. </span><span class="cx"> </span><del>- engine - SQLEngine to compile against - </del><span class="cx"> statement - ClauseElement to be compiled </span><span class="cx"> </span><span class="cx"> parameters - optional dictionary indicating a set of bind parameters </span><span class="lines">@@ -271,10 +269,12 @@ </span><span class="cx"> will also result in the creation of new BindParamClause objects for each key </span><span class="cx"> and will also affect the generated column list in an INSERT statement and the SET </span><span class="cx"> clauses of an UPDATE statement. The keys of the parameter dictionary can </span><del>- either be the string names of columns or actual sqlalchemy.schema.Column objects.""" - self.engine = engine </del><ins>+ either be the string names of columns or ColumnClause objects. + + engine - optional SQLEngine to compile this statement against""" </ins><span class="cx"> self.parameters = parameters </span><span class="cx"> self.statement = statement </span><ins>+ self.engine = engine </ins><span class="cx"> </span><span class="cx"> def __str__(self): </span><span class="cx"> """returns the string text of the generated SQL statement.""" </span><span class="lines">@@ -290,6 +290,10 @@ </span><span class="cx"> """ </span><span class="cx"> raise NotImplementedError() </span><span class="cx"> </span><ins>+ def compile(self): + self.statement.accept_visitor(self) + self.after_compile() + </ins><span class="cx"> def execute(self, *multiparams, **params): </span><span class="cx"> """executes this compiled object using the underlying SQLEngine""" </span><span class="cx"> if len(multiparams): </span><span class="lines">@@ -367,21 +371,26 @@ </span><span class="cx"> return None </span><span class="cx"> </span><span class="cx"> engine = property(lambda s: s._find_engine(), doc="attempts to locate a SQLEngine within this ClauseElement structure, or returns None if none found.") </span><del>- - def compile(self, engine = None, parameters = None, typemap=None): </del><ins>+ + + def compile(self, engine = None, parameters = None, typemap=None, compiler=None): </ins><span class="cx"> """compiles this SQL expression using its underlying SQLEngine to produce </span><span class="cx"> a Compiled object. If no engine can be found, an ansisql engine is used. </span><span class="cx"> bindparams is a dictionary representing the default bind parameters to be used with </span><span class="cx"> the statement. """ </span><del>- if engine is None: - engine = self.engine - - if engine is None: </del><ins>+ + if compiler is None: + if engine is not None: + compiler = engine.compiler(self, parameters) + elif self.engine is not None: + compiler = self.engine.compiler(self, parameters) + + if compiler is None: </ins><span class="cx"> import sqlalchemy.ansisql as ansisql </span><del>- engine = ansisql.engine() </del><ins>+ compiler = ansisql.ANSICompiler(self, parameters=parameters, typemap=typemap) + compiler.compile() + return compiler </ins><span class="cx"> </span><del>- return engine.compile(self, parameters=parameters, typemap=typemap) - </del><span class="cx"> def __str__(self): </span><span class="cx"> return str(self.compile()) </span><span class="cx"> </span><span class="lines">@@ -638,7 +647,7 @@ </span><span class="cx"> being specified as a bind parameter via the bindparam() method, </span><span class="cx"> since it provides more information about what it is, including an optional </span><span class="cx"> type, as well as providing comparison operations.""" </span><del>- def __init__(self, text = "", engine=None, bindparams=None, typemap=None, escape=True): </del><ins>+ def __init__(self, text = "", engine=None, bindparams=None, typemap=None): </ins><span class="cx"> self.parens = False </span><span class="cx"> self._engine = engine </span><span class="cx"> self.id = id(self) </span><span class="lines">@@ -649,12 +658,10 @@ </span><span class="cx"> typemap[key] = engine.type_descriptor(typemap[key]) </span><span class="cx"> def repl(m): </span><span class="cx"> self.bindparams[m.group(1)] = bindparam(m.group(1)) </span><del>- return self.engine.bindtemplate % m.group(1) - - if escape: - self.text = re.compile(r':([\w_]+)', re.S).sub(repl, text) - else: - self.text = text </del><ins>+ return ":%s" % m.group(1) + # scan the string and search for bind parameter names, add them + # to the list of bindparams + self.text = re.compile(r'(?<!:):([\w_]+)', re.S).sub(repl, text) </ins><span class="cx"> if bindparams is not None: </span><span class="cx"> for b in bindparams: </span><span class="cx"> self.bindparams[b.key] = b </span></span></pre></div> <a id="sqlalchemytrunktestselectpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/select.py (1089 => 1090)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/select.py 2006-03-04 17:46:08 UTC (rev 1089) +++ sqlalchemy/trunk/test/select.py 2006-03-04 18:53:35 UTC (rev 1090) </span><span class="lines">@@ -57,15 +57,16 @@ </span><span class="cx"> </span><span class="cx"> class SQLTest(PersistTest): </span><span class="cx"> def runtest(self, clause, result, engine = None, params = None, checkparams = None): </span><del>- c = clause.compile(parameters = params, engine=engine) </del><ins>+ print "TEST with e", engine + c = clause.compile(parameters=params, engine=engine) </ins><span class="cx"> self.echo("\nSQL String:\n" + str(c) + repr(c.get_params())) </span><span class="cx"> cc = re.sub(r'\n', '', str(c)) </span><span class="cx"> self.assert_(cc == result, str(c) + "\n does not match \n" + result) </span><span class="cx"> if checkparams is not None: </span><span class="cx"> if isinstance(checkparams, list): </span><del>- self.assert_(c.get_params().values() == checkparams, "params dont match") </del><ins>+ self.assert_(c.get_params().values() == checkparams, "params dont match ") </ins><span class="cx"> else: </span><del>- self.assert_(c.get_params() == checkparams, "params dont match") </del><ins>+ self.assert_(c.get_params() == checkparams, "params dont match" + repr(c.get_params())) </ins><span class="cx"> </span><span class="cx"> class SelectTest(SQLTest): </span><span class="cx"> def testtableselect(self): </span></span></pre> </div> </div> </body> </html> |