[Sqlalchemy-commits] [1094] sqlalchemy/trunk/test: got column defaults to be executeable
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-03-04 20:23:46
|
<!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>[1094] sqlalchemy/trunk/test: got column defaults to be executeable</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1094</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-04 14:23:37 -0600 (Sat, 04 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>got column defaults to be executeable</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyenginepy">sqlalchemy/trunk/lib/sqlalchemy/engine.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyschemapy">sqlalchemy/trunk/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemytrunktestdefaultspy">sqlalchemy/trunk/test/defaults.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyenginepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/engine.py (1093 => 1094)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-04 20:20:23 UTC (rev 1093) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-04 20:23:37 UTC (rev 1094) </span><span class="lines">@@ -596,6 +596,17 @@ </span><span class="cx"> def _executemany(self, c, statement, parameters): </span><span class="cx"> c.executemany(statement, parameters) </span><span class="cx"> self.context.rowcount = c.rowcount </span><ins>+ + def proxy(self, statement=None, parameters=None): + executemany = parameters is not None and isinstance(parameters, list) + + if self.positional: + if executemany: + parameters = [p.values() for p in parameters] + else: + parameters = parameters.values() + + return self.execute(statement, parameters) </ins><span class="cx"> </span><span class="cx"> def log(self, msg): </span><span class="cx"> """logs a message using this SQLEngine's logger stream.""" </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/schema.py (1093 => 1094)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-03-04 20:20:23 UTC (rev 1093) +++ sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-03-04 20:23:37 UTC (rev 1094) </span><span class="lines">@@ -283,6 +283,7 @@ </span><span class="cx"> self.default = kwargs.pop('default', None) </span><span class="cx"> self.index = kwargs.pop('index', None) </span><span class="cx"> self.unique = kwargs.pop('unique', None) </span><ins>+ self.onupdate = kwargs.pop('onupdate', None) </ins><span class="cx"> if self.index is not None and self.unique is not None: </span><span class="cx"> raise ArgumentError("Column may not define both index and unique") </span><span class="cx"> self._foreign_key = None </span><span class="lines">@@ -302,7 +303,7 @@ </span><span class="cx"> return "Column(%s)" % string.join( </span><span class="cx"> [repr(self.name)] + [repr(self.type)] + </span><span class="cx"> [repr(x) for x in [self.foreign_key] if x is not None] + </span><del>- ["%s=%s" % (k, repr(getattr(self, k))) for k in ['key', 'primary_key', 'nullable', 'hidden', 'default']] </del><ins>+ ["%s=%s" % (k, repr(getattr(self, k))) for k in ['key', 'primary_key', 'nullable', 'hidden', 'default', 'onupdate']] </ins><span class="cx"> , ',') </span><span class="cx"> </span><span class="cx"> def append_item(self, item): </span><span class="lines">@@ -326,6 +327,9 @@ </span><span class="cx"> if self.default is not None: </span><span class="cx"> self.default = ColumnDefault(self.default) </span><span class="cx"> self._init_items(self.default) </span><ins>+ if self.onupdate is not None: + self.onupdate = ColumnDefault(self.onupdate, for_update=True) + self._init_items(self.onupdate) </ins><span class="cx"> self._init_items(*self.args) </span><span class="cx"> self.args = None </span><span class="cx"> </span><span class="lines">@@ -435,17 +439,26 @@ </span><span class="cx"> </span><span class="cx"> class DefaultGenerator(SchemaItem): </span><span class="cx"> """Base class for column "default" values.""" </span><ins>+ def __init__(self, for_update=False, engine=None): + self.for_update = for_update + self.engine = engine </ins><span class="cx"> def _set_parent(self, column): </span><span class="cx"> self.column = column </span><del>- self.column.default = self </del><ins>+ if self.engine is None: + self.engine = column.table.engine + if self.for_update: + self.column.onupdate = self + else: + self.column.default = self </ins><span class="cx"> def execute(self): </span><del>- return self.accept_schema_visitor(self.engine.defaultrunner(self.engine.execute)) </del><ins>+ return self.accept_schema_visitor(self.engine.defaultrunner(self.engine.proxy)) </ins><span class="cx"> def __repr__(self): </span><span class="cx"> return "DefaultGenerator()" </span><span class="cx"> </span><span class="cx"> class PassiveDefault(DefaultGenerator): </span><span class="cx"> """a default that takes effect on the database side""" </span><del>- def __init__(self, arg): </del><ins>+ def __init__(self, arg, **kwargs): + super(PassiveDefault, self).__init__(**kwargs) </ins><span class="cx"> self.arg = arg </span><span class="cx"> def accept_schema_visitor(self, visitor): </span><span class="cx"> return visitor.visit_passive_default(self) </span><span class="lines">@@ -455,7 +468,8 @@ </span><span class="cx"> class ColumnDefault(DefaultGenerator): </span><span class="cx"> """A plain default value on a column. this could correspond to a constant, </span><span class="cx"> a callable function, or a SQL clause.""" </span><del>- def __init__(self, arg): </del><ins>+ def __init__(self, arg, **kwargs): + super(ColumnDefault, self).__init__(**kwargs) </ins><span class="cx"> self.arg = arg </span><span class="cx"> def accept_schema_visitor(self, visitor): </span><span class="cx"> """calls the visit_column_default method on the given visitor.""" </span><span class="lines">@@ -465,12 +479,12 @@ </span><span class="cx"> </span><span class="cx"> class Sequence(DefaultGenerator): </span><span class="cx"> """represents a sequence, which applies to Oracle and Postgres databases.""" </span><del>- def __init__(self, name, start = None, increment = None, optional=False, engine=None): </del><ins>+ def __init__(self, name, start = None, increment = None, optional=False, **kwargs): + super(Sequence, self).__init__(**kwargs) </ins><span class="cx"> self.name = name </span><span class="cx"> self.start = start </span><span class="cx"> self.increment = increment </span><span class="cx"> self.optional=optional </span><del>- self.engine = engine </del><span class="cx"> def __repr__(self): </span><span class="cx"> return "Sequence(%s)" % string.join( </span><span class="cx"> [repr(self.name)] + </span><span class="lines">@@ -479,8 +493,6 @@ </span><span class="cx"> def _set_parent(self, column): </span><span class="cx"> super(Sequence, self)._set_parent(column) </span><span class="cx"> column.sequence = self </span><del>- if self.engine is None: - self.engine = column.table.engine </del><span class="cx"> def create(self): </span><span class="cx"> self.engine.create(self) </span><span class="cx"> return self </span></span></pre></div> <a id="sqlalchemytrunktestdefaultspy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/defaults.py (1093 => 1094)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/defaults.py 2006-03-04 20:20:23 UTC (rev 1093) +++ sqlalchemy/trunk/test/defaults.py 2006-03-04 20:23:37 UTC (rev 1094) </span><span class="lines">@@ -10,7 +10,8 @@ </span><span class="cx"> </span><span class="cx"> class DefaultTest(PersistTest): </span><span class="cx"> </span><del>- def testdefaults(self): </del><ins>+ def setUpAll(self): + global t, f, ts </ins><span class="cx"> x = {'x':50} </span><span class="cx"> def mydefault(): </span><span class="cx"> x['x'] += 1 </span><span class="lines">@@ -56,17 +57,27 @@ </span><span class="cx"> Column('col5', deftype, PassiveDefault(def2)) </span><span class="cx"> ) </span><span class="cx"> t.create() </span><del>- try: - t.insert().execute() - self.assert_(t.engine.lastrow_has_defaults()) - t.insert().execute() - t.insert().execute() </del><ins>+ + def teststandalonedefaults(self): + x = t.c.col1.default.execute() + y = t.c.col2.default.execute() + z = t.c.col3.default.execute() + self.assert_(50 <= x <= 57) + self.assert_(y == 'imthedefault') + self.assert_(z == 6) </ins><span class="cx"> </span><del>- l = t.select().execute() - self.assert_(l.fetchall() == [(51, 'imthedefault', f, ts, ts), (52, 'imthedefault', f, ts, ts), (53, 'imthedefault', f, ts, ts)]) - finally: - t.drop() </del><ins>+ def testinsertdefaults(self): + t.insert().execute() + self.assert_(t.engine.lastrow_has_defaults()) + t.insert().execute() + t.insert().execute() + + l = t.select().execute() + self.assert_(l.fetchall() == [(51, 'imthedefault', f, ts, ts), (52, 'imthedefault', f, ts, ts), (53, 'imthedefault', f, ts, ts)]) </ins><span class="cx"> </span><ins>+ def tearDownAll(self): + t.drop() + </ins><span class="cx"> class SequenceTest(PersistTest): </span><span class="cx"> </span><span class="cx"> def setUpAll(self): </span></span></pre> </div> </div> </body> </html> |