sqlalchemy-commits Mailing List for SQLAlchemy (Page 377)
Brought to you by:
zzzeek
You can subscribe to this list here.
2006 |
Jan
|
Feb
(74) |
Mar
(167) |
Apr
(127) |
May
(190) |
Jun
(119) |
Jul
(77) |
Aug
(82) |
Sep
(84) |
Oct
(153) |
Nov
(45) |
Dec
(54) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(109) |
Feb
(80) |
Mar
(110) |
Apr
(106) |
May
(92) |
Jun
(147) |
Jul
(288) |
Aug
(307) |
Sep
(108) |
Oct
(156) |
Nov
(147) |
Dec
(134) |
2008 |
Jan
(126) |
Feb
(91) |
Mar
(184) |
Apr
(208) |
May
(212) |
Jun
(54) |
Jul
(106) |
Aug
(80) |
Sep
(58) |
Oct
(80) |
Nov
(119) |
Dec
(220) |
2009 |
Jan
(202) |
Feb
(50) |
Mar
(70) |
Apr
(46) |
May
(80) |
Jun
(61) |
Jul
(146) |
Aug
(81) |
Sep
(71) |
Oct
(74) |
Nov
(66) |
Dec
(82) |
2010 |
Jan
(112) |
Feb
(169) |
Mar
(235) |
Apr
(77) |
May
(22) |
Jun
(31) |
Jul
(46) |
Aug
(46) |
Sep
(70) |
Oct
(36) |
Nov
(37) |
Dec
(79) |
2011 |
Jan
(46) |
Feb
(54) |
Mar
(65) |
Apr
(73) |
May
(31) |
Jun
(46) |
Jul
(40) |
Aug
(36) |
Sep
(44) |
Oct
(33) |
Nov
(19) |
Dec
(10) |
2012 |
Jan
(60) |
Feb
(37) |
Mar
(35) |
Apr
(28) |
May
(27) |
Jun
(50) |
Jul
(33) |
Aug
(88) |
Sep
(64) |
Oct
(74) |
Nov
(62) |
Dec
(41) |
2013 |
Jan
(30) |
Feb
(37) |
Mar
(39) |
Apr
(52) |
May
(40) |
Jun
(85) |
Jul
(74) |
Aug
(76) |
Sep
(26) |
Oct
(76) |
Nov
(63) |
Dec
(65) |
2014 |
Jan
(68) |
Feb
(82) |
Mar
(87) |
Apr
(24) |
May
(66) |
Jun
(34) |
Jul
(86) |
Aug
(75) |
Sep
(70) |
Oct
(41) |
Nov
(23) |
Dec
(53) |
2015 |
Jan
(40) |
Feb
(39) |
Mar
(69) |
Apr
(64) |
May
(40) |
Jun
(43) |
Jul
(20) |
Aug
(48) |
Sep
(38) |
Oct
(28) |
Nov
(34) |
Dec
(44) |
2016 |
Jan
(82) |
Feb
(49) |
Mar
(25) |
Apr
(21) |
May
(19) |
Jun
(46) |
Jul
(38) |
Aug
(21) |
Sep
(33) |
Oct
(44) |
Nov
(26) |
Dec
(10) |
2017 |
Jan
(52) |
Feb
(18) |
Mar
(61) |
Apr
(43) |
May
(57) |
Jun
(36) |
Jul
(37) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <co...@sq...> - 2006-02-25 03:25:39
|
<!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>[1031] sqlalchemy/branches/sql_rearrangement/test: dev</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1031</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-24 21:25:29 -0600 (Fri, 24 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>dev</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchessql_rearrangementlibsqlalchemyansisqlpy">sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/ansisql.py</a></li> <li><a href="#sqlalchemybranchessql_rearrangementlibsqlalchemymappingmapperpy">sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/mapping/mapper.py</a></li> <li><a href="#sqlalchemybranchessql_rearrangementlibsqlalchemymappingobjectstorepy">sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/mapping/objectstore.py</a></li> <li><a href="#sqlalchemybranchessql_rearrangementlibsqlalchemyschemapy">sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemybranchessql_rearrangementlibsqlalchemysqlpy">sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/sql.py</a></li> <li><a href="#sqlalchemybranchessql_rearrangementtestselectpy">sqlalchemy/branches/sql_rearrangement/test/select.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchessql_rearrangementlibsqlalchemyansisqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/ansisql.py (1030 => 1031)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/ansisql.py 2006-02-25 02:47:53 UTC (rev 1030) +++ sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/ansisql.py 2006-02-25 03:25:29 UTC (rev 1031) </span><span class="lines">@@ -357,6 +357,7 @@ </span><span class="cx"> self.strings[table] = "" </span><span class="cx"> </span><span class="cx"> def visit_tableclause(self, table): </span><ins>+ print "HI" </ins><span class="cx"> self.froms[table] = table.name </span><span class="cx"> self.strings[table] = "" </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchessql_rearrangementlibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/mapping/mapper.py (1030 => 1031)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/mapping/mapper.py 2006-02-25 02:47:53 UTC (rev 1030) +++ sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/mapping/mapper.py 2006-02-25 03:25:29 UTC (rev 1031) </span><span class="lines">@@ -262,7 +262,7 @@ </span><span class="cx"> """returns an instance of the object based on the given identifier, or None </span><span class="cx"> if not found. The *ident argument is a </span><span class="cx"> list of primary key columns in the order of the table def's primary key columns.""" </span><del>- key = objectstore.get_id_key(ident, self.class_, self.primarytable) </del><ins>+ key = objectstore.get_id_key(ident, self.class_) </ins><span class="cx"> #print "key: " + repr(key) + " ident: " + repr(ident) </span><span class="cx"> return self._get(key, ident) </span><span class="cx"> </span><span class="lines">@@ -284,7 +284,7 @@ </span><span class="cx"> </span><span class="cx"> </span><span class="cx"> def identity_key(self, *primary_key): </span><del>- return objectstore.get_id_key(tuple(primary_key), self.class_, self.primarytable) </del><ins>+ return objectstore.get_id_key(tuple(primary_key), self.class_) </ins><span class="cx"> </span><span class="cx"> def instance_key(self, instance): </span><span class="cx"> return self.identity_key(*[self._getattrbycolumn(instance, column) for column in self.pks_by_table[self.table]]) </span><span class="lines">@@ -683,7 +683,7 @@ </span><span class="cx"> return statement </span><span class="cx"> </span><span class="cx"> def _identity_key(self, row): </span><del>- return objectstore.get_row_key(row, self.class_, self.identitytable, self.pks_by_table[self.table]) </del><ins>+ return objectstore.get_row_key(row, self.class_, self.pks_by_table[self.table]) </ins><span class="cx"> </span><span class="cx"> def _instance(self, row, imap, result = None, populate_existing = False): </span><span class="cx"> """pulls an object instance from the given row and appends it to the given result </span></span></pre></div> <a id="sqlalchemybranchessql_rearrangementlibsqlalchemymappingobjectstorepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/mapping/objectstore.py (1030 => 1031)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/mapping/objectstore.py 2006-02-25 02:47:53 UTC (rev 1030) +++ sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/mapping/objectstore.py 2006-02-25 03:25:29 UTC (rev 1031) </span><span class="lines">@@ -48,7 +48,7 @@ </span><span class="cx"> self.hash_key = hash_key </span><span class="cx"> _sessions[self.hash_key] = self </span><span class="cx"> </span><del>- def get_id_key(ident, class_, table): </del><ins>+ def get_id_key(ident, class_): </ins><span class="cx"> """returns an identity-map key for use in storing/retrieving an item from the identity </span><span class="cx"> map, given a tuple of the object's primary key values. </span><span class="cx"> </span><span class="lines">@@ -62,10 +62,10 @@ </span><span class="cx"> selectable - a Selectable object which represents all the object's column-based fields. </span><span class="cx"> this Selectable may be synonymous with the table argument or can be a larger construct </span><span class="cx"> containing that table. return value: a tuple object which is used as an identity key. """ </span><del>- return (class_, table.hash_key(), tuple(ident)) </del><ins>+ return (class_, tuple(ident)) </ins><span class="cx"> get_id_key = staticmethod(get_id_key) </span><span class="cx"> </span><del>- def get_row_key(row, class_, table, primary_key): </del><ins>+ def get_row_key(row, class_, primary_key): </ins><span class="cx"> """returns an identity-map key for use in storing/retrieving an item from the identity </span><span class="cx"> map, given a result set row. </span><span class="cx"> </span><span class="lines">@@ -80,7 +80,7 @@ </span><span class="cx"> this Selectable may be synonymous with the table argument or can be a larger construct </span><span class="cx"> containing that table. return value: a tuple object which is used as an identity key. </span><span class="cx"> """ </span><del>- return (class_, table.hash_key(), tuple([row[column] for column in primary_key])) </del><ins>+ return (class_, tuple([row[column] for column in primary_key])) </ins><span class="cx"> get_row_key = staticmethod(get_row_key) </span><span class="cx"> </span><span class="cx"> class SessionTrans(object): </span></span></pre></div> <a id="sqlalchemybranchessql_rearrangementlibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/schema.py (1030 => 1031)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/schema.py 2006-02-25 02:47:53 UTC (rev 1030) +++ sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/schema.py 2006-02-25 03:25:29 UTC (rev 1031) </span><span class="lines">@@ -32,9 +32,6 @@ </span><span class="cx"> def _set_parent(self, parent): </span><span class="cx"> """a child item attaches itself to its parent via this method.""" </span><span class="cx"> raise NotImplementedError() </span><del>- def hash_key(self): - """returns a string that identifies this SchemaItem uniquely""" - return "%s(%d)" % (self.__class__.__name__, id(self)) </del><span class="cx"> def __repr__(self): </span><span class="cx"> return "%s()" % self.__class__.__name__ </span><span class="cx"> </span><span class="lines">@@ -120,8 +117,6 @@ </span><span class="cx"> </span><span class="cx"> """ </span><span class="cx"> super(Table, self).__init__(name) </span><del>- self._foreign_keys = [] - self._primary_key = [] </del><span class="cx"> self.engine = engine </span><span class="cx"> self.schema = kwargs.pop('schema', None) </span><span class="cx"> if self.schema is not None: </span><span class="lines">@@ -142,12 +137,6 @@ </span><span class="cx"> else: </span><span class="cx"> return self.schema + "." + self.name </span><span class="cx"> </span><del>- def hash_key(self): - return "Table(%s)" % string.join( - [repr(self.name)] + [self.engine.hash_key()] + - ["%s=%s" % (k, repr(getattr(self, k))) for k in ['schema']], ',' - ) - </del><span class="cx"> def reload_values(self, *args): </span><span class="cx"> """clears out the columns and other properties of this Table, and reloads them from the </span><span class="cx"> given argument list. This is used with the "redefine" keyword argument sent to the </span><span class="lines">@@ -259,9 +248,6 @@ </span><span class="cx"> engine = property(lambda s: s.table.engine) </span><span class="cx"> columns = property(lambda self:[self.column]) </span><span class="cx"> </span><del>- def _get_from_objects(self): - return [self.table] - </del><span class="cx"> def __repr__(self): </span><span class="cx"> return "Column(%s)" % string.join( </span><span class="cx"> [repr(self.name)] + [repr(self.type)] + </span></span></pre></div> <a id="sqlalchemybranchessql_rearrangementlibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/sql.py (1030 => 1031)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/sql.py 2006-02-25 02:47:53 UTC (rev 1030) +++ sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/sql.py 2006-02-25 03:25:29 UTC (rev 1031) </span><span class="lines">@@ -312,18 +312,6 @@ </span><span class="cx"> </span><span class="cx"> class ClauseElement(object): </span><span class="cx"> """base class for elements of a programmatically constructed SQL expression.""" </span><del>- def hash_key(self): - """returns a string that uniquely identifies the concept this ClauseElement - represents. - - two ClauseElements can have the same value for hash_key() iff they both correspond to - the exact same generated SQL. This allows the hash_key() values of a collection of - ClauseElements to be constructed into a larger identifying string for the purpose of - caching a SQL expression. - - Note that since ClauseElements may be mutable, the hash_key() value is subject to - change if the underlying structure of the ClauseElement changes.""" - raise NotImplementedError(repr(self)) </del><span class="cx"> def _get_from_objects(self): </span><span class="cx"> """returns objects represented in this ClauseElement that should be added to the </span><span class="cx"> FROM list of a query.""" </span><span class="lines">@@ -557,8 +545,6 @@ </span><span class="cx"> return [self.oid_column] </span><span class="cx"> else: </span><span class="cx"> return self.primary_key </span><del>- def hash_key(self): - return "FromClause(%s, %s)" % (repr(self.id), repr(self.from_name)) </del><span class="cx"> def accept_visitor(self, visitor): </span><span class="cx"> visitor.visit_fromclause(self) </span><span class="cx"> def count(self, whereclause=None, **params): </span><span class="lines">@@ -632,8 +618,6 @@ </span><span class="cx"> visitor.visit_bindparam(self) </span><span class="cx"> def _get_from_objects(self): </span><span class="cx"> return [] </span><del>- def hash_key(self): - return "BindParam(%s, %s, %s)" % (repr(self.key), repr(self.value), repr(self.shortname)) </del><span class="cx"> def typeprocess(self, value, engine): </span><span class="cx"> return self._get_convert_type(engine).convert_bind_param(value, engine) </span><span class="cx"> def compare(self, other): </span><span class="lines">@@ -679,8 +663,6 @@ </span><span class="cx"> for item in self.bindparams.values(): </span><span class="cx"> item.accept_visitor(visitor) </span><span class="cx"> visitor.visit_textclause(self) </span><del>- def hash_key(self): - return "TextClause(%s)" % repr(self.text) </del><span class="cx"> def _get_from_objects(self): </span><span class="cx"> return [] </span><span class="cx"> </span><span class="lines">@@ -691,8 +673,6 @@ </span><span class="cx"> visitor.visit_null(self) </span><span class="cx"> def _get_from_objects(self): </span><span class="cx"> return [] </span><del>- def hash_key(self): - return "Null" </del><span class="cx"> </span><span class="cx"> class ClauseList(ClauseElement): </span><span class="cx"> """describes a list of clauses. by default, is comma-separated, </span><span class="lines">@@ -703,8 +683,6 @@ </span><span class="cx"> if c is None: continue </span><span class="cx"> self.append(c) </span><span class="cx"> self.parens = kwargs.get('parens', False) </span><del>- def hash_key(self): - return string.join([c.hash_key() for c in self.clauses], ",") </del><span class="cx"> def copy_container(self): </span><span class="cx"> clauses = [clause.copy_container() for clause in self.clauses] </span><span class="cx"> return ClauseList(parens=self.parens, *clauses) </span><span class="lines">@@ -758,8 +736,6 @@ </span><span class="cx"> for c in self.clauses: </span><span class="cx"> f += c._get_from_objects() </span><span class="cx"> return f </span><del>- def hash_key(self): - return string.join([c.hash_key() for c in self.clauses], self.operator or " ") </del><span class="cx"> def compare(self, other): </span><span class="cx"> """compares this CompoundClause to the given item. </span><span class="cx"> </span><span class="lines">@@ -799,8 +775,6 @@ </span><span class="cx"> return BindParamClause(self.name, obj, shortname=self.name, type=self.type) </span><span class="cx"> def select(self): </span><span class="cx"> return select([self]) </span><del>- def hash_key(self): - return self.name + "(" + string.join([c.hash_key() for c in self.clauses], ", ") + ")" </del><span class="cx"> def _compare_type(self, obj): </span><span class="cx"> return self.type </span><span class="cx"> </span><span class="lines">@@ -816,8 +790,6 @@ </span><span class="cx"> return BinaryClause(self.left.copy_container(), self.right.copy_container(), self.operator) </span><span class="cx"> def _get_from_objects(self): </span><span class="cx"> return self.left._get_from_objects() + self.right._get_from_objects() </span><del>- def hash_key(self): - return self.left.hash_key() + (self.operator or " ") + self.right.hash_key() </del><span class="cx"> def accept_visitor(self, visitor): </span><span class="cx"> self.left.accept_visitor(visitor) </span><span class="cx"> self.right.accept_visitor(visitor) </span><span class="lines">@@ -888,9 +860,6 @@ </span><span class="cx"> statement""" </span><span class="cx"> return True </span><span class="cx"> </span><del>- def hash_key(self): - return "Join(%s, %s, %s, %s)" % (repr(self.left.hash_key()), repr(self.right.hash_key()), repr(self.onclause.hash_key()), repr(self.isouter)) - </del><span class="cx"> def select(self, whereclauses = None, **params): </span><span class="cx"> return select([self.left, self.right], whereclauses, from_obj=[self], **params) </span><span class="cx"> </span><span class="lines">@@ -946,10 +915,8 @@ </span><span class="cx"> def _exportable_columns(self): </span><span class="cx"> return self.selectable.columns </span><span class="cx"> </span><del>- def hash_key(self): - return "Alias(%s, %s)" % (self.selectable.hash_key(), repr(self.name)) - </del><span class="cx"> def accept_visitor(self, visitor): </span><ins>+ print "SEL", repr(self.selectable) </ins><span class="cx"> self.selectable.accept_visitor(visitor) </span><span class="cx"> visitor.visit_alias(self) </span><span class="cx"> </span><span class="lines">@@ -980,15 +947,11 @@ </span><span class="cx"> return self.obj._get_from_objects() </span><span class="cx"> def _make_proxy(self, selectable, name = None): </span><span class="cx"> return self.obj._make_proxy(selectable, name=self.name) </span><del>- - def hash_key(self): - return "Label(%s, %s)" % (self.name, self.obj.hash_key()) </del><span class="cx"> </span><span class="cx"> class ColumnClause(ColumnElement): </span><span class="cx"> """represents a textual column clause in a SQL statement. ColumnClause operates </span><span class="cx"> in two modes, one where its just any text that will be placed into the select statement, </span><span class="cx"> and "column" mode, where it represents a column attached to a table.""" </span><del>- </del><span class="cx"> def __init__(self, text, selectable=None): </span><span class="cx"> self.text = text </span><span class="cx"> self.table = selectable </span><span class="lines">@@ -1002,19 +965,13 @@ </span><span class="cx"> key = property(lambda self:self.text) </span><span class="cx"> _label = property(_get_label) </span><span class="cx"> default_label = property(lambda s:s._label) </span><del>- </del><span class="cx"> def accept_visitor(self, visitor): </span><span class="cx"> visitor.visit_columnclause(self) </span><del>- - def hash_key(self): </del><ins>+ def _get_from_objects(self): </ins><span class="cx"> if self.table is not None: </span><del>- return "ColumnClause(%s, %s)" % (self.text, util.hash_key(self.table)) </del><ins>+ return [self.table] </ins><span class="cx"> else: </span><del>- return "ColumnClause(%s)" % self.text - - def _get_from_objects(self): - return [] - </del><ins>+ return [] </ins><span class="cx"> def _bind_param(self, obj): </span><span class="cx"> if self.table.name is None: </span><span class="cx"> return BindParamClause(self.text, obj, shortname=self.text, type=self.type) </span><span class="lines">@@ -1030,6 +987,8 @@ </span><span class="cx"> super(TableClause, self).__init__(name) </span><span class="cx"> self.name = self.id = name </span><span class="cx"> self._columns = util.OrderedProperties() </span><ins>+ self._foreign_keys = [] + self._primary_key = [] </ins><span class="cx"> for c in columns: </span><span class="cx"> self.append_column(c) </span><span class="cx"> </span><span class="lines">@@ -1037,11 +996,13 @@ </span><span class="cx"> self._columns[c.text] = c </span><span class="cx"> c.table = self </span><span class="cx"> def _oid_col(self): </span><ins>+ if self.engine is None: + return None </ins><span class="cx"> # OID remains a little hackish so far </span><span class="cx"> if not hasattr(self, '_oid_column'): </span><span class="cx"> if self.engine.oid_column_name() is not None: </span><del>- self._oid_column = schema.Column(self.table.engine.oid_column_name(), sqltypes.Integer, hidden=True) - self._oid_column._set_parent(self.table) </del><ins>+ self._oid_column = schema.Column(self.engine.oid_column_name(), sqltypes.Integer, hidden=True) + self._oid_column._set_parent(self) </ins><span class="cx"> else: </span><span class="cx"> self._oid_column = None </span><span class="cx"> return self._oid_column </span><span class="lines">@@ -1061,8 +1022,10 @@ </span><span class="cx"> primary_key = property(lambda s:s._primary_key) </span><span class="cx"> foreign_keys = property(lambda s:s._foreign_keys) </span><span class="cx"> original_columns = property(_orig_columns) </span><del>- </del><ins>+ oid_column = property(_oid_col) </ins><span class="cx"> </span><ins>+ def accept_visitor(self, visitor): + visitor.visit_tableclause(self) </ins><span class="cx"> def _exportable_columns(self): </span><span class="cx"> raise NotImplementedError() </span><span class="cx"> def _group_parenthesized(self): </span><span class="lines">@@ -1071,7 +1034,7 @@ </span><span class="cx"> for f in self._get_from_objects(): </span><span class="cx"> data.setdefault(f.id, f) </span><span class="cx"> if asfrom: </span><del>- data[self.id] = self.table </del><ins>+ data[self.id] = self </ins><span class="cx"> def count(self, whereclause=None, **params): </span><span class="cx"> return select([func.count(1).label('count')], whereclause, from_obj=[self], **params) </span><span class="cx"> def join(self, right, *args, **kwargs): </span><span class="lines">@@ -1143,11 +1106,6 @@ </span><span class="cx"> order_by = kwargs.get('order_by', None) </span><span class="cx"> if order_by: </span><span class="cx"> self.order_by(*order_by) </span><del>- def hash_key(self): - return "CompoundSelect(%s)" % string.join( - [util.hash_key(s) for s in self.selects] + - ["%s=%s" % (k, repr(getattr(self, k))) for k in ['use_labels', 'keyword']], - ",") </del><span class="cx"> def _exportable_columns(self): </span><span class="cx"> return self.selects[0].columns </span><span class="cx"> def _proxy_column(self, column): </span><span class="lines">@@ -1240,7 +1198,6 @@ </span><span class="cx"> for f in column._get_from_objects(): </span><span class="cx"> f.accept_visitor(self._correlator) </span><span class="cx"> column._process_from_dict(self._froms, False) </span><del>- </del><span class="cx"> def _exportable_columns(self): </span><span class="cx"> return self._raw_columns </span><span class="cx"> def _proxy_column(self, column): </span><span class="lines">@@ -1265,24 +1222,6 @@ </span><span class="cx"> </span><span class="cx"> _hash_recursion = util.RecursionStack() </span><span class="cx"> </span><del>- def hash_key(self): - # selects call alot of stuff so we do some "recursion checking" - # to eliminate loops - if Select._hash_recursion.push(self): - return "recursive_select()" - try: - return "Select(%s)" % string.join( - [ - "columns=" + string.join([util.hash_key(c) for c in self._raw_columns],','), - "where=" + util.hash_key(self.whereclause), - "from=" + string.join([util.hash_key(f) for f in self.froms],','), - "having=" + util.hash_key(self.having), - "clauses=" + string.join([util.hash_key(c) for c in self.clauses], ',') - ] + ["%s=%s" % (k, repr(getattr(self, k))) for k in ['use_labels', 'distinct', 'limit', 'offset']], "," - ) - finally: - Select._hash_recursion.pop(self) - </del><span class="cx"> def clear_from(self, id): </span><span class="cx"> self.append_from(FromClause(from_name = None, from_key = id)) </span><span class="cx"> </span><span class="lines">@@ -1294,7 +1233,7 @@ </span><span class="cx"> fromclause._process_from_dict(self._froms, True) </span><span class="cx"> </span><span class="cx"> def _get_froms(self): </span><del>- return [f for f in self._froms.values() if self._correlated is None or not self._correlated.has_key(f.id)] </del><ins>+ return [f for f in self._froms.values() if f is not self and (self._correlated is None or not self._correlated.has_key(f.id))] </ins><span class="cx"> froms = property(lambda s: s._get_froms()) </span><span class="cx"> </span><span class="cx"> def accept_visitor(self, visitor): </span><span class="lines">@@ -1340,9 +1279,6 @@ </span><span class="cx"> class UpdateBase(ClauseElement): </span><span class="cx"> """forms the base for INSERT, UPDATE, and DELETE statements.""" </span><span class="cx"> </span><del>- def hash_key(self): - return str(id(self)) - </del><span class="cx"> def _process_colparams(self, parameters): </span><span class="cx"> """receives the "values" of an INSERT or UPDATE statement and constructs </span><span class="cx"> appropriate ind parameters.""" </span></span></pre></div> <a id="sqlalchemybranchessql_rearrangementtestselectpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/sql_rearrangement/test/select.py (1030 => 1031)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/sql_rearrangement/test/select.py 2006-02-25 02:47:53 UTC (rev 1030) +++ sqlalchemy/branches/sql_rearrangement/test/select.py 2006-02-25 03:25:29 UTC (rev 1031) </span><span class="lines">@@ -51,14 +51,12 @@ </span><span class="cx"> column('zip') </span><span class="cx"> ) </span><span class="cx"> </span><del>- </del><span class="cx"> class SQLTest(PersistTest): </span><span class="cx"> def runtest(self, clause, result, engine = None, params = None, checkparams = None): </span><span class="cx"> if engine is None: </span><span class="cx"> engine = db </span><span class="cx"> c = clause.compile(engine, params) </span><span class="cx"> self.echo("\nSQL String:\n" + str(c) + repr(c.get_params())) </span><del>- self.echo("\nHash Key:\n" + clause.hash_key()) </del><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="lines">@@ -75,13 +73,6 @@ </span><span class="cx"> myothertable.othername FROM mytable, myothertable") </span><span class="cx"> </span><span class="cx"> def testsubquery(self): </span><del>- - # TODO: a subquery in a column clause. - #self.runtest( - # select([table, select([table2.c.id])]), - # """""" - #) - </del><span class="cx"> s = select([table1], table1.c.name == 'jack') </span><span class="cx"> print [key for key in s.c.keys()] </span><span class="cx"> self.runtest( </span><span class="lines">@@ -139,15 +130,15 @@ </span><span class="cx"> </span><span class="cx"> def testand(self): </span><span class="cx"> self.runtest( </span><del>- select(['*'], and_(table1.c.id == 12, table1.c.name=='asdf', table2.c.name == 'foo', "sysdate() = today()")), </del><ins>+ select(['*'], and_(table1.c.myid == 12, table1.c.name=='asdf', table2.c.othername == 'foo', "sysdate() = today()")), </ins><span class="cx"> "SELECT * FROM mytable, myothertable WHERE mytable.myid = :mytable_myid AND mytable.name = :mytable_name AND myothertable.othername = :myothertable_othername AND sysdate() = today()" </span><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> def testor(self): </span><span class="cx"> self.runtest( </span><del>- select([table], and_( - table1.c.id == 12, - or_(table2.c.name=='asdf', table2.c.name == 'foo', table2.c.id == 9), </del><ins>+ select([table1], and_( + table1.c.myid == 12, + or_(table2.c.othername=='asdf', table2.c.othername == 'foo', table2.c.otherid == 9), </ins><span class="cx"> "sysdate() = today()", </span><span class="cx"> )), </span><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable, myothertable WHERE mytable.myid = :mytable_myid AND (myothertable.othername = :myothertable_othername OR myothertable.othername = :myothertable_othername_1 OR myothertable.otherid = :myothertable_otherid) AND sysdate() = today()", </span><span class="lines">@@ -156,7 +147,7 @@ </span><span class="cx"> </span><span class="cx"> def testoperators(self): </span><span class="cx"> self.runtest( </span><del>- table1.select((table1.c.id != 12) & ~(table1.c.name=='john')), </del><ins>+ table1.select((table1.c.myid != 12) & ~(table1.c.name=='john')), </ins><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid != :mytable_myid AND NOT (mytable.name = :mytable_name)" </span><span class="cx"> ) </span><span class="cx"> </span><span class="lines">@@ -166,35 +157,35 @@ </span><span class="cx"> </span><span class="cx"> def testmultiparam(self): </span><span class="cx"> self.runtest( </span><del>- select(["*"], or_(table1.c.id == 12, table1.c.id=='asdf', table1.c.id == 'foo')), </del><ins>+ select(["*"], or_(table1.c.myid == 12, table1.c.myid=='asdf', table1.c.myid == 'foo')), </ins><span class="cx"> "SELECT * FROM mytable WHERE mytable.myid = :mytable_myid OR mytable.myid = :mytable_myid_1 OR mytable.myid = :mytable_myid_2" </span><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> def testorderby(self): </span><span class="cx"> self.runtest( </span><del>- table2.select(order_by = [table2.c.id, asc(table2.c.name)]), </del><ins>+ table2.select(order_by = [table2.c.otherid, asc(table2.c.othername)]), </ins><span class="cx"> "SELECT myothertable.otherid, myothertable.othername FROM myothertable ORDER BY myothertable.otherid, myothertable.othername ASC" </span><span class="cx"> ) </span><span class="cx"> def testgroupby(self): </span><span class="cx"> self.runtest( </span><del>- select([table2.c.name, func.count(table2.c.id)], group_by = [table2.c.name]), </del><ins>+ select([table2.c.othername, func.count(table2.c.otherid)], group_by = [table2.c.othername]), </ins><span class="cx"> "SELECT myothertable.othername, count(myothertable.otherid) FROM myothertable GROUP BY myothertable.othername" </span><span class="cx"> ) </span><span class="cx"> def testgroupby_and_orderby(self): </span><span class="cx"> self.runtest( </span><del>- select([table2.c.name, func.count(table2.c.id)], group_by = [table2.c.name], order_by = [table2.c.name]), </del><ins>+ select([table2.c.othername, func.count(table2.c.otherid)], group_by = [table2.c.othername], order_by = [table2.c.othername]), </ins><span class="cx"> "SELECT myothertable.othername, count(myothertable.otherid) FROM myothertable GROUP BY myothertable.othername ORDER BY myothertable.othername" </span><span class="cx"> ) </span><span class="cx"> def testalias(self): </span><span class="cx"> # test the alias for a table1. column names stay the same, table name "changes" to "foo". </span><span class="cx"> self.runtest( </span><del>- select([alias(table, 'foo')]) </del><ins>+ select([alias(table1, 'foo')]) </ins><span class="cx"> ,"SELECT foo.myid, foo.name, foo.description FROM mytable AS foo") </span><span class="cx"> </span><span class="cx"> # create a select for a join of two tables. use_labels means the column names will have </span><span class="cx"> # labels tablename_columnname, which become the column keys accessible off the Selectable object. </span><span class="cx"> # also, only use one column from the second table and all columns from the first table1. </span><del>- q = select([table, table2.c.id], table1.c.id == table2.c.id, use_labels = True) </del><ins>+ q = select([table1, table2.c.otherid], table1.c.myid == table2.c.otherid, use_labels = True) </ins><span class="cx"> </span><span class="cx"> # make an alias of the "selectable". column names stay the same (i.e. the labels), table name "changes" to "t2view". </span><span class="cx"> a = alias(q, 't2view') </span><span class="lines">@@ -264,11 +255,11 @@ </span><span class="cx"> </span><span class="cx"> def testtextmix(self): </span><span class="cx"> self.runtest(select( </span><del>- [table, table2.c.id, "sysdate()", "foo, bar, lala"], </del><ins>+ [table1, table2.c.otherid, "sysdate()", "foo, bar, lala"], </ins><span class="cx"> and_( </span><span class="cx"> "foo.id = foofoo(lala)", </span><span class="cx"> "datetime(foo) = Today", </span><del>- table1.c.id == table2.c.id, </del><ins>+ table1.c.myid == table2.c.otherid, </ins><span class="cx"> ) </span><span class="cx"> ), </span><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, sysdate(), foo, bar, lala \ </span><span class="lines">@@ -276,39 +267,39 @@ </span><span class="cx"> </span><span class="cx"> def testtextualsubquery(self): </span><span class="cx"> self.runtest(select( </span><del>- [alias(table, 't'), "foo.f"], </del><ins>+ [alias(table1, 't'), "foo.f"], </ins><span class="cx"> "foo.f = t.id", </span><span class="cx"> from_obj = ["(select f from bar where lala=heyhey) foo"] </span><span class="cx"> ), </span><span class="cx"> "SELECT t.myid, t.name, t.description, foo.f FROM mytable AS t, (select f from bar where lala=heyhey) foo WHERE foo.f = t.id") </span><span class="cx"> </span><span class="cx"> def testliteral(self): </span><del>- self.runtest(select([literal("foo") + literal("bar")], from_obj=[table]), </del><ins>+ self.runtest(select([literal("foo") + literal("bar")], from_obj=[table1]), </ins><span class="cx"> "SELECT :literal + :literal_1 FROM mytable", engine=db) </span><span class="cx"> </span><span class="cx"> def testfunction(self): </span><del>- self.runtest(func.lala(3, 4, literal("five"), table1.c.id) * table2.c.id, </del><ins>+ self.runtest(func.lala(3, 4, literal("five"), table1.c.myid) * table2.c.otherid, </ins><span class="cx"> "lala(:lala, :lala_1, :literal, mytable.myid) * myothertable.otherid", engine=db) </span><span class="cx"> </span><span class="cx"> def testjoin(self): </span><span class="cx"> self.runtest( </span><del>- join(table2, table, table1.c.id == table2.c.id).select(), </del><ins>+ join(table2, table1, table1.c.myid == table2.c.otherid).select(), </ins><span class="cx"> "SELECT myothertable.otherid, myothertable.othername, mytable.myid, mytable.name, \ </span><span class="cx"> mytable.description FROM myothertable JOIN mytable ON mytable.myid = myothertable.otherid" </span><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> self.runtest( </span><span class="cx"> select( </span><del>- [table], - from_obj = [join(table, table2, table1.c.id == table2.c.id)] </del><ins>+ [table1], + from_obj = [join(table1, table2, table1.c.myid == table2.c.otherid)] </ins><span class="cx"> ), </span><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable JOIN myothertable ON mytable.myid = myothertable.otherid") </span><span class="cx"> </span><span class="cx"> self.runtest( </span><span class="cx"> select( </span><del>- [join(join(table, table2, table1.c.id == table2.c.id), table3, table1.c.id == table3.c.id) </del><ins>+ [join(join(table1, table2, table1.c.myid == table2.c.otherid), table3, table1.c.myid == table3.c.userid) </ins><span class="cx"> ]), </span><del>- "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername, thirdtable1.userid, thirdtable1.otherstuff FROM mytable JOIN myothertable ON mytable.myid = myothertable.otherid JOIN thirdtable ON mytable.myid = thirdtable1.userid" </del><ins>+ "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername, thirdtable.userid, thirdtable.otherstuff FROM mytable JOIN myothertable ON mytable.myid = myothertable.otherid JOIN thirdtable ON mytable.myid = thirdtable.userid" </ins><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> self.runtest( </span><span class="lines">@@ -320,24 +311,24 @@ </span><span class="cx"> self.runtest( </span><span class="cx"> select([table, table2, table3], </span><span class="cx"> </span><del>- from_obj = [join(table, table2, table1.c.id == table2.c.id).outerjoin(table3, table1.c.id==table3.c.id)] </del><ins>+ from_obj = [join(table, table2, table1.c.myid == table2.c.otherid).outerjoin(table3, table1.c.myid==table3.c.userid)] </ins><span class="cx"> </span><del>- #from_obj = [outerjoin(join(table, table2, table1.c.id == table2.c.id), table3, table1.c.id==table3.c.id)] </del><ins>+ #from_obj = [outerjoin(join(table, table2, table1.c.myid == table2.c.otherid), table3, table1.c.myid==table3.c.userid)] </ins><span class="cx"> ) </span><span class="cx"> ,"SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername, thirdtable1.userid, thirdtable1.otherstuff FROM mytable JOIN myothertable ON mytable.myid = myothertable.otherid LEFT OUTER JOIN thirdtable ON mytable.myid = thirdtable1.userid" </span><span class="cx"> ) </span><span class="cx"> self.runtest( </span><span class="cx"> select([table, table2, table3], </span><del>- from_obj = [outerjoin(table, join(table2, table3, table2.c.id == table3.c.id), table1.c.id==table2.c.id)] </del><ins>+ from_obj = [outerjoin(table, join(table2, table3, table2.c.otherid == table3.c.userid), table1.c.myid==table2.c.otherid)] </ins><span class="cx"> ) </span><span class="cx"> ,"SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername, thirdtable1.userid, thirdtable1.otherstuff FROM mytable LEFT OUTER JOIN (myothertable JOIN thirdtable ON myothertable.otherid = thirdtable1.userid) ON mytable.myid = myothertable.otherid" </span><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> def testunion(self): </span><span class="cx"> x = union( </span><del>- select([table], table1.c.id == 5), - select([table], table1.c.id == 12), - order_by = [table1.c.id], </del><ins>+ select([table], table1.c.myid == 5), + select([table], table1.c.myid == 12), + order_by = [table1.c.myid], </ins><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> self.runtest(x, "SELECT mytable.myid, mytable.name, mytable.description \ </span><span class="lines">@@ -367,11 +358,11 @@ </span><span class="cx"> [table, table2], </span><span class="cx"> and_( </span><span class="cx"> table1.c.name == 'fred', </span><del>- table1.c.id == 10, - table2.c.name != 'jack', </del><ins>+ table1.c.myid == 10, + table2.c.othername != 'jack', </ins><span class="cx"> "EXISTS (select yay from foo where boo = lar)" </span><span class="cx"> ), </span><del>- from_obj = [ outerjoin(table, table2, table1.c.id == table2.c.id) ] </del><ins>+ from_obj = [ outerjoin(table, table2, table1.c.myid == table2.c.otherid) ] </ins><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> self.runtest(query, </span><span class="lines">@@ -393,7 +384,7 @@ </span><span class="cx"> def testbindparam(self): </span><span class="cx"> self.runtest(select( </span><span class="cx"> [table, table2], </span><del>- and_(table1.c.id == table2.c.id, </del><ins>+ and_(table1.c.myid == table2.c.otherid, </ins><span class="cx"> table1.c.name == bindparam('mytablename'), </span><span class="cx"> ) </span><span class="cx"> ), </span><span class="lines">@@ -403,23 +394,23 @@ </span><span class="cx"> </span><span class="cx"> # check that the bind params sent along with a compile() call </span><span class="cx"> # get preserved when the params are retreived later </span><del>- s = select([table], table1.c.id == bindparam('test')) </del><ins>+ s = select([table], table1.c.myid == bindparam('test')) </ins><span class="cx"> c = s.compile(parameters = {'test' : 7}) </span><span class="cx"> self.assert_(c.get_params() == {'test' : 7}) </span><span class="cx"> </span><span class="cx"> def testcorrelatedsubquery(self): </span><span class="cx"> self.runtest( </span><del>- table1.select(table1.c.id == select([table2.c.id], table1.c.name == table2.c.name)), </del><ins>+ table1.select(table1.c.myid == select([table2.c.otherid], table1.c.name == table2.c.othername)), </ins><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid = (SELECT myothertable.otherid AS id FROM myothertable WHERE mytable.name = myothertable.othername)" </span><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> self.runtest( </span><del>- table1.select(exists([1], table2.c.id == table1.c.id)), </del><ins>+ table1.select(exists([1], table2.c.otherid == table1.c.myid)), </ins><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE EXISTS (SELECT 1 FROM myothertable WHERE myothertable.otherid = mytable.myid)" </span><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> talias = table1.alias('ta') </span><del>- s = subquery('sq2', [talias], exists([1], table2.c.id == talias.c.id)) </del><ins>+ s = subquery('sq2', [talias], exists([1], table2.c.otherid == talias.c.id)) </ins><span class="cx"> self.runtest( </span><span class="cx"> select([s, table]) </span><span class="cx"> ,"SELECT sq2.id, sq2.name, sq2.description, mytable.myid, mytable.name, mytable.description FROM (SELECT ta.myid AS id, ta.name AS name, ta.description AS description FROM mytable AS ta WHERE EXISTS (SELECT 1 FROM myothertable WHERE myothertable.otherid = ta.myid)) AS sq2, mytable") </span><span class="lines">@@ -430,10 +421,10 @@ </span><span class="cx"> """SELECT users.user_id, users.user_name, users.password, s.street FROM users, (SELECT addresses.street AS street FROM addresses WHERE addresses.user_id = users.user_id) AS s""") </span><span class="cx"> </span><span class="cx"> def testin(self): </span><del>- self.runtest(select([table], table1.c.id.in_(1, 2, 3)), </del><ins>+ self.runtest(select([table], table1.c.myid.in_(1, 2, 3)), </ins><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid IN (:mytable_myid, :mytable_myid_1, :mytable_myid_2)") </span><span class="cx"> </span><del>- self.runtest(select([table], table1.c.id.in_(select([table2.c.id]))), </del><ins>+ self.runtest(select([table], table1.c.myid.in_(select([table2.c.otherid]))), </ins><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid IN (SELECT myothertable.otherid AS id FROM myothertable)") </span><span class="cx"> </span><span class="cx"> def testlateargs(self): </span><span class="lines">@@ -454,7 +445,7 @@ </span><span class="cx"> # insert with user-supplied bind params for specific columns, </span><span class="cx"> # cols provided literally </span><span class="cx"> self.runtest( </span><del>- insert(table, {table1.c.id : bindparam('userid'), table1.c.name : bindparam('username')}), </del><ins>+ insert(table, {table1.c.myid : bindparam('userid'), table1.c.name : bindparam('username')}), </ins><span class="cx"> "INSERT INTO mytable (myid, name) VALUES (:userid, :username)") </span><span class="cx"> </span><span class="cx"> # insert with user-supplied bind params for specific columns, cols </span><span class="lines">@@ -472,13 +463,13 @@ </span><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> def testupdate(self): </span><del>- self.runtest(update(table, table1.c.id == 7), "UPDATE mytable SET name=:name WHERE mytable.myid = :mytable_myid", params = {table1.c.name:'fred'}) - self.runtest(update(table, table1.c.id == 7), "UPDATE mytable SET name=:name WHERE mytable.myid = :mytable_myid", params = {'name':'fred'}) - self.runtest(update(table, values = {table1.c.name : table1.c.id}), "UPDATE mytable SET name=mytable.myid") </del><ins>+ self.runtest(update(table, table1.c.myid == 7), "UPDATE mytable SET name=:name WHERE mytable.myid = :mytable_myid", params = {table1.c.name:'fred'}) + self.runtest(update(table, table1.c.myid == 7), "UPDATE mytable SET name=:name WHERE mytable.myid = :mytable_myid", params = {'name':'fred'}) + self.runtest(update(table, values = {table1.c.name : table1.c.myid}), "UPDATE mytable SET name=mytable.myid") </ins><span class="cx"> self.runtest(update(table, whereclause = table1.c.name == bindparam('crit'), values = {table1.c.name : 'hi'}), "UPDATE mytable SET name=:name WHERE mytable.name = :crit", params = {'crit' : 'notthere'}) </span><del>- self.runtest(update(table, table1.c.id == 12, values = {table1.c.name : table1.c.id}), "UPDATE mytable SET name=mytable.myid, description=:description WHERE mytable.myid = :mytable_myid", params = {'description':'test'}) - self.runtest(update(table, table1.c.id == 12, values = {table1.c.id : 9}), "UPDATE mytable SET myid=:myid, description=:description WHERE mytable.myid = :mytable_myid", params = {'mytable_myid': 12, 'myid': 9, 'description': 'test'}) - s = table1.update(table1.c.id == 12, values = {table1.c.name : 'lala'}) </del><ins>+ self.runtest(update(table, table1.c.myid == 12, values = {table1.c.name : table1.c.myid}), "UPDATE mytable SET name=mytable.myid, description=:description WHERE mytable.myid = :mytable_myid", params = {'description':'test'}) + self.runtest(update(table, table1.c.myid == 12, values = {table1.c.myid : 9}), "UPDATE mytable SET myid=:myid, description=:description WHERE mytable.myid = :mytable_myid", params = {'mytable_myid': 12, 'myid': 9, 'description': 'test'}) + s = table1.update(table1.c.myid == 12, values = {table1.c.name : 'lala'}) </ins><span class="cx"> print str(s) </span><span class="cx"> c = s.compile(parameters = {'mytable_id':9,'name':'h0h0'}) </span><span class="cx"> print str(c) </span><span class="lines">@@ -486,11 +477,11 @@ </span><span class="cx"> </span><span class="cx"> def testupdateexpression(self): </span><span class="cx"> self.runtest(update(table, </span><del>- (table1.c.id == func.hoho(4)) & </del><ins>+ (table1.c.myid == func.hoho(4)) & </ins><span class="cx"> (table1.c.name == literal('foo') + table1.c.name + literal('lala')), </span><span class="cx"> values = { </span><span class="cx"> table1.c.name : table1.c.name + "lala", </span><del>- table1.c.id : func.do_stuff(table1.c.id, literal('hoho')) </del><ins>+ table1.c.myid : func.do_stuff(table1.c.myid, literal('hoho')) </ins><span class="cx"> }), "UPDATE mytable SET myid=(do_stuff(mytable.myid, :literal_2)), name=(mytable.name + :mytable_name) WHERE mytable.myid = hoho(:hoho) AND mytable.name = :literal + mytable.name + :literal_1") </span><span class="cx"> </span><span class="cx"> def testcorrelatedupdate(self): </span><span class="lines">@@ -499,12 +490,12 @@ </span><span class="cx"> self.runtest(u, "UPDATE mytable SET name=(select name from mytable where id=mytable.id)") </span><span class="cx"> </span><span class="cx"> # test against a regular constructed subquery </span><del>- s = select([table2], table2.c.id == table1.c.id) </del><ins>+ s = select([table2], table2.c.otherid == table1.c.myid) </ins><span class="cx"> u = update(table, table1.c.name == 'jack', values = {table1.c.name : s}) </span><span class="cx"> self.runtest(u, "UPDATE mytable SET name=(SELECT myothertable.otherid, myothertable.othername FROM myothertable WHERE myothertable.otherid = mytable.myid) WHERE mytable.name = :mytable_name") </span><span class="cx"> </span><span class="cx"> def testdelete(self): </span><del>- self.runtest(delete(table, table1.c.id == 7), "DELETE FROM mytable WHERE mytable.myid = :mytable_myid") </del><ins>+ self.runtest(delete(table, table1.c.myid == 7), "DELETE FROM mytable WHERE mytable.myid = :mytable_myid") </ins><span class="cx"> </span><span class="cx"> class SchemaTest(SQLTest): </span><span class="cx"> def testselect(self): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-25 02:48:06
|
<!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>[1030] sqlalchemy/branches/sql_rearrangement/test: basic idea within sql package</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1030</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-24 20:47:53 -0600 (Fri, 24 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>basic idea within sql package</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchessql_rearrangementlibsqlalchemy__init__py">sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/__init__.py</a></li> <li><a href="#sqlalchemybranchessql_rearrangementlibsqlalchemyansisqlpy">sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/ansisql.py</a></li> <li><a href="#sqlalchemybranchessql_rearrangementlibsqlalchemyenginepy">sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/engine.py</a></li> <li><a href="#sqlalchemybranchessql_rearrangementlibsqlalchemyschemapy">sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemybranchessql_rearrangementlibsqlalchemysqlpy">sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/sql.py</a></li> <li><a href="#sqlalchemybranchessql_rearrangementtestselectpy">sqlalchemy/branches/sql_rearrangement/test/select.py</a></li> <li><a href="#sqlalchemybranchessql_rearrangementtesttestbasepy">sqlalchemy/branches/sql_rearrangement/test/testbase.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchessql_rearrangementlibsqlalchemy__init__py"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/__init__.py (1029 => 1030)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/__init__.py 2006-02-25 01:12:33 UTC (rev 1029) +++ sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/__init__.py 2006-02-25 02:47:53 UTC (rev 1030) </span><span class="lines">@@ -6,8 +6,8 @@ </span><span class="cx"> </span><span class="cx"> from engine import * </span><span class="cx"> from types import * </span><ins>+from sql import * </ins><span class="cx"> from schema import * </span><span class="cx"> from exceptions import * </span><del>-from sql import * </del><span class="cx"> import mapping as mapperlib </span><span class="cx"> from mapping import * </span></span></pre></div> <a id="sqlalchemybranchessql_rearrangementlibsqlalchemyansisqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/ansisql.py (1029 => 1030)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/ansisql.py 2006-02-25 01:12:33 UTC (rev 1029) +++ sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/ansisql.py 2006-02-25 02:47:53 UTC (rev 1030) </span><span class="lines">@@ -257,11 +257,11 @@ </span><span class="cx"> l = co.label(co._label) </span><span class="cx"> l.accept_visitor(self) </span><span class="cx"> inner_columns[co._label] = l </span><del>- elif select.issubquery and isinstance(co, Column): </del><ins>+ elif select.issubquery and isinstance(co, sql.ColumnClause) and co.table is not None: </ins><span class="cx"> # SQLite doesnt like selecting from a subquery where the column </span><span class="cx"> # names look like table.colname, so add a label synonomous with </span><span class="cx"> # the column name </span><del>- l = co.label(co.key) </del><ins>+ l = co.label(co.text) </ins><span class="cx"> l.accept_visitor(self) </span><span class="cx"> inner_columns[self.get_str(l.obj)] = l </span><span class="cx"> else: </span><span class="lines">@@ -355,6 +355,10 @@ </span><span class="cx"> def visit_table(self, table): </span><span class="cx"> self.froms[table] = table.fullname </span><span class="cx"> self.strings[table] = "" </span><ins>+ + def visit_tableclause(self, table): + self.froms[table] = table.name + self.strings[table] = "" </ins><span class="cx"> </span><span class="cx"> def visit_join(self, join): </span><span class="cx"> # TODO: ppl are going to want RIGHT, FULL OUTER and NATURAL joins. </span></span></pre></div> <a id="sqlalchemybranchessql_rearrangementlibsqlalchemyenginepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/engine.py (1029 => 1030)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/engine.py 2006-02-25 01:12:33 UTC (rev 1029) +++ sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/engine.py 2006-02-25 02:47:53 UTC (rev 1030) </span><span class="lines">@@ -16,8 +16,7 @@ </span><span class="cx"> of DBAPI, and is the central switching point for abstracting different kinds of database </span><span class="cx"> behavior into a consistent set of behaviors. It provides a variety of factory methods </span><span class="cx"> to produce everything specific to a certain kind of database, including a Compiler, </span><del>-schema creation/dropping objects, and TableImpl and ColumnImpl objects to augment the -behavior of table metadata objects. </del><ins>+schema creation/dropping objects. </ins><span class="cx"> </span><span class="cx"> The term "database-specific" will be used to describe any object or function that has behavior </span><span class="cx"> corresponding to a particular vendor, such as mysql-specific, sqlite-specific, etc. </span><span class="lines">@@ -315,28 +314,6 @@ </span><span class="cx"> """given a Table object, reflects its columns and properties from the database.""" </span><span class="cx"> raise NotImplementedError() </span><span class="cx"> </span><del>- def tableimpl(self, table, **kwargs): - """returns a new sql.TableImpl object to correspond to the given Table object. - A TableImpl provides SQL statement builder operations on a Table metadata object, - and a subclass of this object may be provided by a SQLEngine subclass to provide - database-specific behavior.""" - return sql.TableImpl(table) - - def columnimpl(self, column): - """returns a new sql.ColumnImpl object to correspond to the given Column object. - A ColumnImpl provides SQL statement builder operations on a Column metadata object, - and a subclass of this object may be provided by a SQLEngine subclass to provide - database-specific behavior.""" - return sql.ColumnImpl(column) - - def indeximpl(self, index): - """returns a new sql.IndexImpl object to correspond to the given Index - object. An IndexImpl provides SQL statement builder operations on an - Index metadata object, and a subclass of this object may be provided - by a SQLEngine subclass to provide database-specific behavior. - """ - return sql.IndexImpl(index) - </del><span class="cx"> def get_default_schema_name(self): </span><span class="cx"> """returns the currently selected schema in the current connection.""" </span><span class="cx"> return None </span></span></pre></div> <a id="sqlalchemybranchessql_rearrangementlibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/schema.py (1029 => 1030)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/schema.py 2006-02-25 01:12:33 UTC (rev 1029) +++ sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/schema.py 2006-02-25 02:47:53 UTC (rev 1030) </span><span class="lines">@@ -14,7 +14,7 @@ </span><span class="cx"> the schema package "plugs in" to the SQL package. </span><span class="cx"> </span><span class="cx"> """ </span><del>- </del><ins>+import sql </ins><span class="cx"> from util import * </span><span class="cx"> from types import * </span><span class="cx"> from exceptions import * </span><span class="lines">@@ -29,30 +29,15 @@ </span><span class="cx"> for item in args: </span><span class="cx"> if item is not None: </span><span class="cx"> item._set_parent(self) </span><del>- - def accept_visitor(self, visitor): - """all schema items implement an accept_visitor method that should call the appropriate - visit_XXXX method upon the given visitor object.""" - raise NotImplementedError() - </del><span class="cx"> def _set_parent(self, parent): </span><span class="cx"> """a child item attaches itself to its parent via this method.""" </span><span class="cx"> raise NotImplementedError() </span><del>- </del><span class="cx"> def hash_key(self): </span><span class="cx"> """returns a string that identifies this SchemaItem uniquely""" </span><span class="cx"> return "%s(%d)" % (self.__class__.__name__, id(self)) </span><del>- </del><span class="cx"> def __repr__(self): </span><span class="cx"> return "%s()" % self.__class__.__name__ </span><span class="cx"> </span><del>- def __getattr__(self, key): - """proxies method calls to an underlying implementation object for methods not found - locally""" - if not self.__dict__.has_key('_impl'): - raise AttributeError(key) - return getattr(self._impl, key) - </del><span class="cx"> def _get_table_key(engine, name, schema): </span><span class="cx"> if schema is not None and schema == engine.get_default_schema_name(): </span><span class="cx"> schema = None </span><span class="lines">@@ -95,7 +80,7 @@ </span><span class="cx"> return table </span><span class="cx"> </span><span class="cx"> </span><del>-class Table(SchemaItem): </del><ins>+class Table(sql.TableClause, SchemaItem): </ins><span class="cx"> """represents a relational database table. </span><span class="cx"> </span><span class="cx"> Be sure to look at sqlalchemy.sql.TableImpl for additional methods defined on a Table.""" </span><span class="lines">@@ -134,14 +119,11 @@ </span><span class="cx"> the same table twice will result in an exception. </span><span class="cx"> </span><span class="cx"> """ </span><del>- self.name = name - self.columns = OrderedProperties() - self.c = self.columns - self.foreign_keys = [] - self.primary_key = [] </del><ins>+ super(Table, self).__init__(name) + self._foreign_keys = [] + self._primary_key = [] </ins><span class="cx"> self.engine = engine </span><span class="cx"> self.schema = kwargs.pop('schema', None) </span><del>- self._impl = self.engine.tableimpl(self, **kwargs) </del><span class="cx"> if self.schema is not None: </span><span class="cx"> self.fullname = "%s.%s" % (self.schema, self.name) </span><span class="cx"> else: </span><span class="lines">@@ -174,30 +156,38 @@ </span><span class="cx"> self.c = self.columns </span><span class="cx"> self.foreign_keys = [] </span><span class="cx"> self.primary_key = [] </span><del>- self._impl = self.engine.tableimpl(self) </del><span class="cx"> self._init_items(*args) </span><span class="cx"> </span><span class="cx"> def append_item(self, item): </span><span class="cx"> """appends a Column item or other schema item to this Table.""" </span><span class="cx"> self._init_items(item) </span><del>- </del><ins>+ + def append_column(self, column): + if not column.hidden: + self._columns[column.key] = self + if column.primary_key: + self.primary_key.append(column) + column.table = self + column.type = self.engine.type_descriptor(column.type) + </ins><span class="cx"> def _set_parent(self, schema): </span><span class="cx"> schema.tables[self.name] = self </span><span class="cx"> self.schema = schema </span><del>- </del><span class="cx"> def accept_visitor(self, visitor): </span><span class="cx"> """traverses the given visitor across the Column objects inside this Table, </span><span class="cx"> then calls the visit_table method on the visitor.""" </span><span class="cx"> for c in self.columns: </span><span class="cx"> c.accept_visitor(visitor) </span><span class="cx"> return visitor.visit_table(self) </span><del>- </del><span class="cx"> def deregister(self): </span><span class="cx"> """removes this table from it's engines table registry. this does not </span><span class="cx"> issue a SQL DROP statement.""" </span><span class="cx"> key = _get_table_key(self.engine, self.name, self.schema) </span><span class="cx"> del self.engine.tables[key] </span><del>- </del><ins>+ def create(self, **params): + self.engine.create(self) + def drop(self, **params): + self.engine.drop(self) </ins><span class="cx"> def toengine(self, engine, schema=None): </span><span class="cx"> """returns a singleton instance of this Table with a different engine""" </span><span class="cx"> try: </span><span class="lines">@@ -211,7 +201,7 @@ </span><span class="cx"> args.append(c.copy()) </span><span class="cx"> return Table(self.name, engine, schema=schema, *args) </span><span class="cx"> </span><del>-class Column(SchemaItem): </del><ins>+class Column(sql.ColumnClause, SchemaItem): </ins><span class="cx"> """represents a column in a database table.""" </span><span class="cx"> def __init__(self, name, type, *args, **kwargs): </span><span class="cx"> """constructs a new Column object. Arguments are: </span><span class="lines">@@ -244,8 +234,8 @@ </span><span class="cx"> hidden=False : indicates this column should not be listed in the table's list of columns. Used for the "oid" </span><span class="cx"> column, which generally isnt in column lists. </span><span class="cx"> """ </span><del>- self.name = str(name) # in case of incoming unicode - self.type = type </del><ins>+ name = str(name) # in case of incoming unicode + super(Column, self).__init__(name, None) </ins><span class="cx"> self.args = args </span><span class="cx"> self.key = kwargs.pop('key', name) </span><span class="cx"> self.primary_key = kwargs.pop('primary_key', False) </span><span class="lines">@@ -257,10 +247,20 @@ </span><span class="cx"> self._parent = None </span><span class="cx"> if len(kwargs): </span><span class="cx"> raise ArgumentError("Unknown arguments passed to Column: " + repr(kwargs.keys())) </span><ins>+ + if self.default is not None: + self.default = ColumnDefault(self.default) + self.default._set_parent(self) + + self._init_items(*self.args) </ins><span class="cx"> </span><span class="cx"> original = property(lambda s: s._orig or s) </span><span class="cx"> parent = property(lambda s:s._parent or s) </span><span class="cx"> engine = property(lambda s: s.table.engine) </span><ins>+ columns = property(lambda self:[self.column]) + + def _get_from_objects(self): + return [self.table] </ins><span class="cx"> </span><span class="cx"> def __repr__(self): </span><span class="cx"> return "Column(%s)" % string.join( </span><span class="lines">@@ -282,16 +282,7 @@ </span><span class="cx"> def _set_parent(self, table): </span><span class="cx"> if getattr(self, 'table', None) is not None: </span><span class="cx"> raise ArgumentError("this Column already has a table!") </span><del>- if not self.hidden: - table.columns[self.key] = self - if self.primary_key: - table.primary_key.append(self) - self.table = table - if self.table.engine is not None: - self.type = self.table.engine.type_descriptor(self.type) - - self._impl = self.table.engine.columnimpl(self) - </del><ins>+ table.append_column(self) </ins><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><span class="lines">@@ -320,7 +311,6 @@ </span><span class="cx"> selectable.columns[c.key] = c </span><span class="cx"> if self.primary_key: </span><span class="cx"> selectable.primary_key.append(c) </span><del>- c._impl = self.engine.columnimpl(c) </del><span class="cx"> if fk is not None: </span><span class="cx"> c._init_items(fk) </span><span class="cx"> return c </span><span class="lines">@@ -334,21 +324,6 @@ </span><span class="cx"> self.foreign_key.accept_visitor(visitor) </span><span class="cx"> visitor.visit_column(self) </span><span class="cx"> </span><del>- def __lt__(self, other): return self._impl.__lt__(other) - def __le__(self, other): return self._impl.__le__(other) - def __eq__(self, other): return self._impl.__eq__(other) - def __ne__(self, other): return self._impl.__ne__(other) - def __gt__(self, other): return self._impl.__gt__(other) - def __ge__(self, other): return self._impl.__ge__(other) - def __add__(self, other): return self._impl.__add__(other) - def __sub__(self, other): return self._impl.__sub__(other) - def __mul__(self, other): return self._impl.__mul__(other) - def __and__(self, other): return self._impl.__and__(other) - def __or__(self, other): return self._impl.__or__(other) - def __div__(self, other): return self._impl.__div__(other) - def __truediv__(self, other): return self._impl.__truediv__(other) - def __invert__(self, other): return self._impl.__invert__(other) - def __str__(self): return self._impl.__str__() </del><span class="cx"> </span><span class="cx"> class ForeignKey(SchemaItem): </span><span class="cx"> """defines a ForeignKey constraint between two columns. ForeignKey is </span><span class="lines">@@ -499,9 +474,12 @@ </span><span class="cx"> "%s is from %s not %s" % (column, </span><span class="cx"> column.table, </span><span class="cx"> self.table)) </span><del>- # set my _impl from col.table.engine - self._impl = self.table.engine.indeximpl(self) - </del><ins>+ def create(self): + self._engine.create(self.index) + def drop(self): + self._engine.drop(self.index) + def execute(self): + self.create() </ins><span class="cx"> def accept_visitor(self, visitor): </span><span class="cx"> visitor.visit_index(self) </span><span class="cx"> def __str__(self): </span></span></pre></div> <a id="sqlalchemybranchessql_rearrangementlibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/sql.py (1029 => 1030)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/sql.py 2006-02-25 01:12:33 UTC (rev 1029) +++ sqlalchemy/branches/sql_rearrangement/lib/sqlalchemy/sql.py 2006-02-25 02:47:53 UTC (rev 1030) </span><span class="lines">@@ -13,7 +13,7 @@ </span><span class="cx"> import string, re, random </span><span class="cx"> types = __import__('types') </span><span class="cx"> </span><del>-__all__ = ['text', 'column', 'func', 'select', 'update', 'insert', 'delete', 'join', 'and_', 'or_', 'not_', 'union', 'union_all', 'desc', 'asc', 'outerjoin', 'alias', 'subquery', 'literal', 'bindparam', 'exists'] </del><ins>+__all__ = ['text', 'table', 'column', 'func', 'select', 'update', 'insert', 'delete', 'join', 'and_', 'or_', 'not_', 'union', 'union_all', 'desc', 'asc', 'outerjoin', 'alias', 'subquery', 'literal', 'bindparam', 'exists'] </ins><span class="cx"> </span><span class="cx"> def desc(column): </span><span class="cx"> """returns a descending ORDER BY clause element, e.g.: </span><span class="lines">@@ -160,11 +160,13 @@ </span><span class="cx"> """returns a Label object for the given selectable, used in the column list for a select statement.""" </span><span class="cx"> return Label(name, obj) </span><span class="cx"> </span><del>-def column(table, text): </del><ins>+def column(text, table=None): </ins><span class="cx"> """returns a textual column clause, relative to a table. this differs from using straight text </span><del>- or text() in that the column is treated like a regular column, i.e. gets added to a Selectable's list - of columns.""" </del><ins>+ or text() in that the column is treated like a regular column, i.e. gets added to a Selectable's list of columns.""" </ins><span class="cx"> return ColumnClause(text, table) </span><ins>+ +def table(name, *columns): + return TableClause(name, *columns) </ins><span class="cx"> </span><span class="cx"> def bindparam(key, value = None, type=None): </span><span class="cx"> """creates a bind parameter clause with the given key. </span><span class="lines">@@ -222,15 +224,16 @@ </span><span class="cx"> return CompoundSelect(keyword, *selects, **kwargs) </span><span class="cx"> </span><span class="cx"> def _is_literal(element): </span><del>- return not isinstance(element, ClauseElement) and not isinstance(element, schema.SchemaItem) </del><ins>+ return not isinstance(element, ClauseElement) </ins><span class="cx"> </span><span class="cx"> def is_column(col): </span><del>- return isinstance(col, schema.Column) or isinstance(col, ColumnElement) </del><ins>+ return isinstance(col, ColumnElement) </ins><span class="cx"> </span><del>-class ClauseVisitor(schema.SchemaVisitor): </del><ins>+class ClauseVisitor(object): </ins><span class="cx"> """builds upon SchemaVisitor to define the visiting of SQL statement elements in </span><span class="cx"> addition to Schema elements.""" </span><span class="cx"> def visit_columnclause(self, column):pass </span><ins>+ def visit_tableclause(self, column):pass </ins><span class="cx"> def visit_fromclause(self, fromclause):pass </span><span class="cx"> def visit_bindparam(self, bindparam):pass </span><span class="cx"> def visit_textclause(self, textclause):pass </span><span class="lines">@@ -363,6 +366,8 @@ </span><span class="cx"> except AttributeError: </span><span class="cx"> pass </span><span class="cx"> for f in self._get_from_objects(): </span><ins>+ if f is self: + continue </ins><span class="cx"> engine = f.engine </span><span class="cx"> if engine is not None: </span><span class="cx"> return engine </span><span class="lines">@@ -980,17 +985,23 @@ </span><span class="cx"> return "Label(%s, %s)" % (self.name, self.obj.hash_key()) </span><span class="cx"> </span><span class="cx"> class ColumnClause(ColumnElement): </span><del>- """represents a textual column clause in a SQL statement. allows the creation - of an additional ad-hoc column that is compiled against a particular table.""" </del><ins>+ """represents a textual column clause in a SQL statement. ColumnClause operates + in two modes, one where its just any text that will be placed into the select statement, + and "column" mode, where it represents a column attached to a table.""" </ins><span class="cx"> </span><span class="cx"> def __init__(self, text, selectable=None): </span><span class="cx"> self.text = text </span><span class="cx"> self.table = selectable </span><span class="cx"> self.type = sqltypes.NullTypeEngine() </span><del>- </del><ins>+ def _get_label(self): + if self.table is not None: + return self.table.name + "_" + self.text + else: + return self.text </ins><span class="cx"> name = property(lambda self:self.text) </span><span class="cx"> key = property(lambda self:self.text) </span><del>- _label = property(lambda self:self.text) </del><ins>+ _label = property(_get_label) + default_label = property(lambda s:s._label) </ins><span class="cx"> </span><span class="cx"> def accept_visitor(self, visitor): </span><span class="cx"> visitor.visit_columnclause(self) </span><span class="lines">@@ -1014,78 +1025,26 @@ </span><span class="cx"> selectable.columns[c.key] = c </span><span class="cx"> return c </span><span class="cx"> </span><del>-class ColumnImpl(ColumnElement): - """gets attached to a schema.Column object.""" - - def __init__(self, column): - self.column = column - self.name = column.name - - if column.table.name: - self._label = column.table.name + "_" + self.column.name - else: - self._label = self.column.name </del><ins>+class TableClause(FromClause): + def __init__(self, name, *columns): + super(TableClause, self).__init__(name) + self.name = self.id = name + self._columns = util.OrderedProperties() + for c in columns: + self.append_column(c) </ins><span class="cx"> </span><del>- engine = property(lambda s: s.column.engine) - default_label = property(lambda s:s._label) - original = property(lambda self:self.column.original) - parent = property(lambda self:self.column.parent) - columns = property(lambda self:[self.column]) - - def label(self, name): - return Label(name, self.column) - - def copy_container(self): - return self.column - - def compare(self, other): - """compares this ColumnImpl's column to the other given Column""" - return self.column is other - - def _group_parenthesized(self): - return False - - def _get_from_objects(self): - return [self.column.table] - - def _bind_param(self, obj): - if self.column.table.name is None: - return BindParamClause(self.name, obj, shortname = self.name, type = self.column.type) - else: - return BindParamClause(self.column.table.name + "_" + self.name, obj, shortname = self.name, type = self.column.type) - def _compare_self(self): - """allows ColumnImpl to return its Column object for usage in ClauseElements, all others to - just return self""" - return self.column - def _compare_type(self, obj): - return self.column.type - - def compile(self, engine = None, parameters = None, typemap=None): - if engine is None: - engine = self.engine - if engine is None: - raise InvalidRequestError("no SQLEngine could be located within this ClauseElement.") - return engine.compile(self.column, parameters=parameters, typemap=typemap) - -class TableImpl(FromClause): - """attached to a schema.Table to provide it with a Selectable interface - as well as other functions - """ - - def __init__(self, table): - self.table = table - self.id = self.table.name - </del><ins>+ def append_column(self, c): + self._columns[c.text] = c + c.table = self </ins><span class="cx"> def _oid_col(self): </span><span class="cx"> # OID remains a little hackish so far </span><span class="cx"> if not hasattr(self, '_oid_column'): </span><del>- if self.table.engine.oid_column_name() is not None: </del><ins>+ if self.engine.oid_column_name() is not None: </ins><span class="cx"> self._oid_column = schema.Column(self.table.engine.oid_column_name(), sqltypes.Integer, hidden=True) </span><span class="cx"> self._oid_column._set_parent(self.table) </span><span class="cx"> else: </span><span class="cx"> self._oid_column = None </span><span class="cx"> return self._oid_column </span><del>- </del><span class="cx"> def _orig_columns(self): </span><span class="cx"> try: </span><span class="cx"> return self._orig_cols </span><span class="lines">@@ -1097,47 +1056,40 @@ </span><span class="cx"> if oid is not None: </span><span class="cx"> self._orig_cols[oid.original] = oid </span><span class="cx"> return self._orig_cols </span><del>- - oid_column = property(_oid_col) - engine = property(lambda s: s.table.engine) - columns = property(lambda self: self.table.columns) - primary_key = property(lambda self:self.table.primary_key) - foreign_keys = property(lambda self:self.table.foreign_keys) </del><ins>+ columns = property(lambda s:s._columns) + c = property(lambda s:s._columns) + primary_key = property(lambda s:s._primary_key) + foreign_keys = property(lambda s:s._foreign_keys) </ins><span class="cx"> original_columns = property(_orig_columns) </span><ins>+ </ins><span class="cx"> </span><span class="cx"> def _exportable_columns(self): </span><span class="cx"> raise NotImplementedError() </span><del>- </del><span class="cx"> def _group_parenthesized(self): </span><span class="cx"> return False </span><del>- </del><span class="cx"> def _process_from_dict(self, data, asfrom): </span><span class="cx"> for f in self._get_from_objects(): </span><span class="cx"> data.setdefault(f.id, f) </span><span class="cx"> if asfrom: </span><span class="cx"> data[self.id] = self.table </span><span class="cx"> def count(self, whereclause=None, **params): </span><del>- return select([func.count(1).label('count')], whereclause, from_obj=[self.table], **params) </del><ins>+ return select([func.count(1).label('count')], whereclause, from_obj=[self], **params) </ins><span class="cx"> def join(self, right, *args, **kwargs): </span><del>- return Join(self.table, right, *args, **kwargs) </del><ins>+ return Join(self, right, *args, **kwargs) </ins><span class="cx"> def outerjoin(self, right, *args, **kwargs): </span><del>- return Join(self.table, right, isouter = True, *args, **kwargs) </del><ins>+ return Join(self, right, isouter = True, *args, **kwargs) </ins><span class="cx"> def alias(self, name=None): </span><del>- return Alias(self.table, name) </del><ins>+ return Alias(self, name) </ins><span class="cx"> def select(self, whereclause = None, **params): </span><del>- return select([self.table], whereclause, **params) </del><ins>+ return select([self], whereclause, **params) </ins><span class="cx"> def insert(self, values = None): </span><del>- return insert(self.table, values=values) </del><ins>+ return insert(self, values=values) </ins><span class="cx"> def update(self, whereclause = None, values = None): </span><del>- return update(self.table, whereclause, values) </del><ins>+ return update(self, whereclause, values) </ins><span class="cx"> def delete(self, whereclause = None): </span><del>- return delete(self.table, whereclause) - def create(self, **params): - self.table.engine.create(self.table) - def drop(self, **params): - self.table.engine.drop(self.table) </del><ins>+ return delete(self, whereclause) </ins><span class="cx"> def _get_from_objects(self): </span><del>- return [self.table] </del><ins>+ return [self] </ins><span class="cx"> </span><span class="cx"> class SelectBaseMixin(object): </span><span class="cx"> """base class for Select and CompoundSelects""" </span><span class="lines">@@ -1457,25 +1409,3 @@ </span><span class="cx"> self.whereclause.accept_visitor(visitor) </span><span class="cx"> visitor.visit_delete(self) </span><span class="cx"> </span><del>-class IndexImpl(ClauseElement): - - def __init__(self, index): - self.index = index - self.name = index.name - self._engine = self.index.table.engine - - table = property(lambda s: s.index.table) - columns = property(lambda s: s.index.columns) - - def hash_key(self): - return self.index.hash_key() - def accept_visitor(self, visitor): - visitor.visit_index(self.index) - def compare(self, other): - return self.index is other - def create(self): - self._engine.create(self.index) - def drop(self): - self._engine.drop(self.index) - def execute(self): - self.create() </del></span></pre></div> <a id="sqlalchemybranchessql_rearrangementtestselectpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/sql_rearrangement/test/select.py (1029 => 1030)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/sql_rearrangement/test/select.py 2006-02-25 01:12:33 UTC (rev 1029) +++ sqlalchemy/branches/sql_rearrangement/test/select.py 2006-02-25 02:47:53 UTC (rev 1030) </span><span class="lines">@@ -1,60 +1,61 @@ </span><span class="cx"> </span><span class="cx"> from sqlalchemy import * </span><span class="cx"> import sqlalchemy.ansisql as ansisql </span><del>-import sqlalchemy.databases.postgres as postgres -import sqlalchemy.databases.oracle as oracle -import sqlalchemy.databases.sqlite as sqlite </del><ins>+#import sqlalchemy.databases.postgres as postgres +#import sqlalchemy.databases.oracle as oracle +#import sqlalchemy.databases.sqlite as sqlite </ins><span class="cx"> </span><span class="cx"> db = ansisql.engine() </span><span class="cx"> </span><span class="cx"> from testbase import PersistTest </span><span class="cx"> import unittest, re </span><span class="cx"> </span><del>- -table = Table('mytable', db, - Column('myid', Integer, key = 'id'), - Column('name', String, key = 'name'), - Column('description', String, key = 'description'), </del><ins>+table1 = table('mytable', + column('myid'), + column('name'), + column('description'), </ins><span class="cx"> ) </span><span class="cx"> </span><del>-table2 = Table( - 'myothertable', db, - Column('otherid', Integer, key='id'), - Column('othername', String, key='name'), </del><ins>+table2 = table( + 'myothertable', + column('otherid'), + column('othername'), </ins><span class="cx"> ) </span><span class="cx"> </span><del>-table3 = Table( - 'thirdtable', db, - Column('userid', Integer, key='id'), - Column('otherstuff', Integer), </del><ins>+table3 = table( + 'thirdtable', + column('userid'), + column('otherstuff'), </ins><span class="cx"> ) </span><span class="cx"> </span><del>-table4 = Table( - 'remotetable', db, - Column('rem_id', Integer, primary_key=True), - Column('datatype_id', Integer), - Column('value', String(20)), - schema = 'remote_owner' </del><ins>+table4 = table( + 'remotetable', + column('rem_id'), + column('datatype_id'), + column('value'), +# schema = 'remote_owner' </ins><span class="cx"> ) </span><span class="cx"> </span><del>-users = Table('users', db, - Column('user_id', Integer, primary_key = True), - Column('user_name', String(40)), - Column('password', String(10)), </del><ins>+users = table('users', + column('user_id'), + column('user_name'), + column('password'), </ins><span class="cx"> ) </span><span class="cx"> </span><del>-addresses = Table('addresses', db, - Column('address_id', Integer, primary_key = True), - Column('user_id', Integer, ForeignKey("users.user_id")), - Column('street', String(100)), - Column('city', String(80)), - Column('state', String(2)), - Column('zip', String(10)) </del><ins>+addresses = table('addresses', + column('address_id'), + column('user_id'), + column('street'), + column('city'), + column('state'), + column('zip') </ins><span class="cx"> ) </span><span class="cx"> </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><ins>+ if engine is None: + engine = db </ins><span class="cx"> c = clause.compile(engine, params) </span><span class="cx"> self.echo("\nSQL String:\n" + str(c) + repr(c.get_params())) </span><span class="cx"> self.echo("\nHash Key:\n" + clause.hash_key()) </span><span class="lines">@@ -67,12 +68,10 @@ </span><span class="cx"> self.assert_(c.get_params() == checkparams, "params dont match") </span><span class="cx"> </span><span class="cx"> class SelectTest(SQLTest): </span><del>- - </del><span class="cx"> def testtableselect(self): </span><del>- self.runtest(table.select(), "SELECT mytable.myid, mytable.name, mytable.description FROM mytable") </del><ins>+ self.runtest(table1.select(), "SELECT mytable.myid, mytable.name, mytable.description FROM mytable") </ins><span class="cx"> </span><del>- self.runtest(select([table, table2]), "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, \ </del><ins>+ self.runtest(select([table1, table2]), "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, \ </ins><span class="cx"> myothertable.othername FROM mytable, myothertable") </span><span class="cx"> </span><span class="cx"> def testsubquery(self): </span><span class="lines">@@ -83,37 +82,37 @@ </span><span class="cx"> # """""" </span><span class="cx"> #) </span><span class="cx"> </span><del>- s = select([table], table.c.name == 'jack') </del><ins>+ s = select([table1], table1.c.name == 'jack') </ins><span class="cx"> print [key for key in s.c.keys()] </span><span class="cx"> self.runtest( </span><span class="cx"> select( </span><span class="cx"> [s], </span><del>- s.c.id == 7 </del><ins>+ s.c.myid == 7 </ins><span class="cx"> ) </span><span class="cx"> , </span><del>- "SELECT id, name, description FROM (SELECT mytable.myid AS id, mytable.name AS name, mytable.description AS description FROM mytable WHERE mytable.name = :mytable_name) WHERE id = :id") </del><ins>+ "SELECT myid, name, description FROM (SELECT mytable.myid AS myid, mytable.name AS name, mytable.description AS description FROM mytable WHERE mytable.name = :mytable_name) WHERE myid = :myid") </ins><span class="cx"> </span><del>- sq = select([table]) </del><ins>+ sq = select([table1]) </ins><span class="cx"> self.runtest( </span><span class="cx"> sq.select(), </span><del>- "SELECT id, name, description FROM (SELECT mytable.myid AS id, mytable.name AS name, mytable.description AS description FROM mytable)" </del><ins>+ "SELECT myid, name, description FROM (SELECT mytable.myid AS myid, mytable.name AS name, mytable.description AS description FROM mytable)" </ins><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> sq = subquery( </span><span class="cx"> 'sq', </span><del>- [table], </del><ins>+ [table1], </ins><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> self.runtest( </span><del>- sq.select(sq.c.id == 7), - "SELECT sq.id, sq.name, sq.description FROM \ -(SELECT mytable.myid AS id, mytable.name AS name, mytable.description AS description FROM mytable) AS sq WHERE sq.id = :sq_id" </del><ins>+ sq.select(sq.c.myid == 7), + "SELECT sq.myid, sq.name, sq.description FROM \ +(SELECT mytable.myid AS myid, mytable.name AS name, mytable.description AS description FROM mytable) AS sq WHERE sq.myid = :sq_myid" </ins><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> sq = subquery( </span><span class="cx"> 'sq', </span><del>- [table, table2], - and_(table.c.id ==7, table2.c.id==table.c.id), </del><ins>+ [table1, table2], + and_(table1.c.myid ==7, table2.c.otherid==table1.c.myid), </ins><span class="cx"> use_labels = True </span><span class="cx"> ) </span><span class="cx"> </span><span class="lines">@@ -140,14 +139,14 @@ </span><span class="cx"> </span><span class="cx"> def testand(self): </span><span class="cx"> self.runtest( </span><del>- select(['*'], and_(table.c.id == 12, table.c.name=='asdf', table2.c.name == 'foo', "sysdate() = today()")), </del><ins>+ select(['*'], and_(table1.c.id == 12, table1.c.name=='asdf', table2.c.name == 'foo', "sysdate() = today()")), </ins><span class="cx"> "SELECT * FROM mytable, myothertable WHERE mytable.myid = :mytable_myid AND mytable.name = :mytable_name AND myothertable.othername = :myothertable_othername AND sysdate() = today()" </span><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> def testor(self): </span><span class="cx"> self.runtest( </span><span class="cx"> select([table], and_( </span><del>- table.c.id == 12, </del><ins>+ table1.c.id == 12, </ins><span class="cx"> or_(table2.c.name=='asdf', table2.c.name == 'foo', table2.c.id == 9), </span><span class="cx"> "sysdate() = today()", </span><span class="cx"> )), </span><span class="lines">@@ -157,7 +156,7 @@ </span><span class="cx"> </span><span class="cx"> def testoperators(self): </span><span class="cx"> self.runtest( </span><del>- table.select((table.c.id != 12) & ~(table.c.name=='john')), </del><ins>+ table1.select((table1.c.id != 12) & ~(table1.c.name=='john')), </ins><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid != :mytable_myid AND NOT (mytable.name = :mytable_name)" </span><span class="cx"> ) </span><span class="cx"> </span><span class="lines">@@ -167,7 +166,7 @@ </span><span class="cx"> </span><span class="cx"> def testmultiparam(self): </span><span class="cx"> self.runtest( </span><del>- select(["*"], or_(table.c.id == 12, table.c.id=='asdf', table.c.id == 'foo')), </del><ins>+ select(["*"], or_(table1.c.id == 12, table1.c.id=='asdf', table1.c.id == 'foo')), </ins><span class="cx"> "SELECT * FROM mytable WHERE mytable.myid = :mytable_myid OR mytable.myid = :mytable_myid_1 OR mytable.myid = :mytable_myid_2" </span><span class="cx"> ) </span><span class="cx"> </span><span class="lines">@@ -187,15 +186,15 @@ </span><span class="cx"> "SELECT myothertable.othername, count(myothertable.otherid) FROM myothertable GROUP BY myothertable.othername ORDER BY myothertable.othername" </span><span class="cx"> ) </span><span class="cx"> def testalias(self): </span><del>- # test the alias for a table. column names stay the same, table name "changes" to "foo". </del><ins>+ # test the alias for a table1. column names stay the same, table name "changes" to "foo". </ins><span class="cx"> self.runtest( </span><span class="cx"> select([alias(table, 'foo')]) </span><span class="cx"> ,"SELECT foo.myid, foo.name, foo.description FROM mytable AS foo") </span><span class="cx"> </span><span class="cx"> # create a select for a join of two tables. use_labels means the column names will have </span><span class="cx"> # labels tablename_columnname, which become the column keys accessible off the Selectable object. </span><del>- # also, only use one column from the second table and all columns from the first table. - q = select([table, table2.c.id], table.c.id == table2.c.id, use_labels = True) </del><ins>+ # also, only use one column from the second table and all columns from the first table1. + q = select([table, table2.c.id], table1.c.id == table2.c.id, use_labels = True) </ins><span class="cx"> </span><span class="cx"> # make an alias of the "selectable". column names stay the same (i.e. the labels), table name "changes" to "t2view". </span><span class="cx"> a = alias(q, 't2view') </span><span class="lines">@@ -269,7 +268,7 @@ </span><span class="cx"> and_( </span><span class="cx"> "foo.id = foofoo(lala)", </span><span class="cx"> "datetime(foo) = Today", </span><del>- table.c.id == table2.c.id, </del><ins>+ table1.c.id == table2.c.id, </ins><span class="cx"> ) </span><span class="cx"> ), </span><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, sysdate(), foo, bar, lala \ </span><span class="lines">@@ -288,12 +287,12 @@ </span><span class="cx"> "SELECT :literal + :literal_1 FROM mytable", engine=db) </span><span class="cx"> </span><span class="cx"> def testfunction(self): </span><del>- self.runtest(func.lala(3, 4, literal("five"), table.c.id) * table2.c.id, </del><ins>+ self.runtest(func.lala(3, 4, literal("five"), table1.c.id) * table2.c.id, </ins><span class="cx"> "lala(:lala, :lala_1, :literal, mytable.myid) * myothertable.otherid", engine=db) </span><span class="cx"> </span><span class="cx"> def testjoin(self): </span><span class="cx"> self.runtest( </span><del>- join(table2, table, table.c.id == table2.c.id).select(), </del><ins>+ join(table2, table, table1.c.id == table2.c.id).select(), </ins><span class="cx"> "SELECT myothertable.otherid, myothertable.othername, mytable.myid, mytable.name, \ </span><span class="cx"> mytable.description FROM myothertable JOIN mytable ON mytable.myid = myothertable.otherid" </span><span class="cx"> ) </span><span class="lines">@@ -301,15 +300,15 @@ </span><span class="cx"> self.runtest( </span><span class="cx"> select( </span><span class="cx"> [table], </span><del>- from_obj = [join(table, table2, table.c.id == table2.c.id)] </del><ins>+ from_obj = [join(table, table2, table1.c.id == table2.c.id)] </ins><span class="cx"> ), </span><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable JOIN myothertable ON mytable.myid = myothertable.otherid") </span><span class="cx"> </span><span class="cx"> self.runtest( </span><span class="cx"> select( </span><del>- [join(join(table, table2, table.c.id == table2.c.id), table3, table.c.id == table3.c.id) </del><ins>+ [join(join(table, table2, table1.c.id == table2.c.id), table3, table1.c.id == table3.c.id) </ins><span class="cx"> ]), </span><del>- "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername, thirdtable.userid, thirdtable.otherstuff FROM mytable JOIN myothertable ON mytable.myid = myothertable.otherid JOIN thirdtable ON mytable.myid = thirdtable.userid" </del><ins>+ "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername, thirdtable1.userid, thirdtable1.otherstuff FROM mytable JOIN myothertable ON mytable.myid = myothertable.otherid JOIN thirdtable ON mytable.myid = thirdtable1.userid" </ins><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> self.runtest( </span><span class="lines">@@ -321,24 +320,24 @@ </span><span class="cx"> self.runtest( </span><span class="cx"> select([table, table2, table3], </span><span class="cx"> </span><del>- from_obj = [join(table, table2, table.c.id == table2.c.id).outerjoin(table3, table.c.id==table3.c.id)] </del><ins>+ from_obj = [join(table, table2, table1.c.id == table2.c.id).outerjoin(table3, table1.c.id==table3.c.id)] </ins><span class="cx"> </span><del>- #from_obj = [outerjoin(join(table, table2, table.c.id == table2.c.id), table3, table.c.id==table3.c.id)] </del><ins>+ #from_obj = [outerjoin(join(table, table2, table1.c.id == table2.c.id), table3, table1.c.id==table3.c.id)] </ins><span class="cx"> ) </span><del>- ,"SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername, thirdtable.userid, thirdtable.otherstuff FROM mytable JOIN myothertable ON mytable.myid = myothertable.otherid LEFT OUTER JOIN thirdtable ON mytable.myid = thirdtable.userid" </del><ins>+ ,"SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername, thirdtable1.userid, thirdtable1.otherstuff FROM mytable JOIN myothertable ON mytable.myid = myothertable.otherid LEFT OUTER JOIN thirdtable ON mytable.myid = thirdtable1.userid" </ins><span class="cx"> ) </span><span class="cx"> self.runtest( </span><span class="cx"> select([table, table2, table3], </span><del>- from_obj = [outerjoin(table, join(table2, table3, table2.c.id == table3.c.id), table.c.id==table2.c.id)] </del><ins>+ from_obj = [outerjoin(table, join(table2, table3, table2.c.id == table3.c.id), table1.c.id==table2.c.id)] </ins><span class="cx"> ) </span><del>- ,"SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername, thirdtable.userid, thirdtable.otherstuff FROM mytable LEFT OUTER JOIN (myothertable JOIN thirdtable ON myothertable.otherid = thirdtable.userid) ON mytable.myid = myothertable.otherid" </del><ins>+ ,"SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername, thirdtable1.userid, thirdtable1.otherstuff FROM mytable LEFT OUTER JOIN (myothertable JOIN thirdtable ON myothertable.otherid = thirdtable1.userid) ON mytable.myid = myothertable.otherid" </ins><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> def testunion(self): </span><span class="cx"> x = union( </span><del>- select([table], table.c.id == 5), - select([table], table.c.id == 12), - order_by = [table.c.id], </del><ins>+ select([table], table1.c.id == 5), + select([table], table1.c.id == 12), + order_by = [table1.c.id], </ins><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> self.runtest(x, "SELECT mytable.myid, mytable.name, mytable.description \ </span><span class="lines">@@ -355,7 +354,7 @@ </span><span class="cx"> , </span><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description \ </span><span class="cx"> FROM mytable UNION SELECT myothertable.otherid, myothertable.othername \ </span><del>-FROM myothertable UNION SELECT thirdtable.userid, thirdtable.otherstuff FROM thirdtable") </del><ins>+FROM myothertable UNION SELECT thirdtable1.userid, thirdtable1.otherstuff FROM thirdtable") </ins><span class="cx"> </span><span class="cx"> </span><span class="cx"> def testouterjoin(self): </span><span class="lines">@@ -367,12 +366,12 @@ </span><span class="cx"> query = select( </span><span class="cx"> [table, table2], </span><span class="cx"> and_( </span><del>- table.c.name == 'fred', - table.c.id == 10, </del><ins>+ table1.c.name == 'fred', + table1.c.id == 10, </ins><span class="cx"> table2.c.name != 'jack', </span><span class="cx"> "EXISTS (select yay from foo where boo = lar)" </span><span class="cx"> ), </span><del>- from_obj = [ outerjoin(table, table2, table.c.id == table2.c.id) ] </del><ins>+ from_obj = [ outerjoin(table, table2, table1.c.id == table2.c.id) ] </ins><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> self.runtest(query, </span><span class="lines">@@ -394,8 +393,8 @@ </span><span class="cx"> def testbindparam(self): </span><span class="cx"> self.runtest(select( </span><span class="cx"> [table, table2], </span><del>- and_(table.c.id == table2.c.id, - table.c.name == bindparam('mytablename'), </del><ins>+ and_(table1.c.id == table2.c.id, + table1.c.name == bindparam('mytablename'), </ins><span class="cx"> ) </span><span class="cx"> ), </span><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername \ </span><span class="lines">@@ -404,22 +403,22 @@ </span><span class="cx"> </span><span class="cx"> # check that the bind params sent along with a compile() call </span><span class="cx"> # get preserved when the params are retreived later </span><del>- s = select([table], table.c.id == bindparam('test')) </del><ins>+ s = select([table], table1.c.id == bindparam('test')) </ins><span class="cx"> c = s.compile(parameters = {'test' : 7}) </span><span class="cx"> self.assert_(c.get_params() == {'test' : 7}) </span><span class="cx"> </span><span class="cx"> def testcorrelatedsubquery(self): </span><span class="cx"> self.runtest( </span><del>- table.select(table.c.id == select([table2.c.id], table.c.name == table2.c.name)), </del><ins>+ table1.select(table1.c.id == select([table2.c.id], table1.c.name == table2.c.name)), </ins><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid = (SELECT myothertable.otherid AS id FROM myothertable WHERE mytable.name = myothertable.othername)" </span><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> self.runtest( </span><del>- table.select(exists([1], table2.c.id == table.c.id)), </del><ins>+ table1.select(exists([1], table2.c.id == table1.c.id)), </ins><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE EXISTS (SELECT 1 FROM myothertable WHERE myothertable.otherid = mytable.myid)" </span><span class="cx"> ) </span><span class="cx"> </span><del>- talias = table.alias('ta') </del><ins>+ talias = table1.alias('ta') </ins><span class="cx"> s = subquery('sq2', [talias], exists([1], table2.c.id == talias.c.id)) </span><span class="cx"> self.runtest( </span><span class="cx"> select([s, table]) </span><span class="lines">@@ -431,21 +430,21 @@ </span><span class="cx"> """SELECT users.user_id, users.user_name, users.password, s.street FROM users, (SELECT addresses.street AS street FROM addresses WHERE addresses.user_id = users.user_id) AS s""") </span><span class="cx"> </span><span class="cx"> def testin(self): </span><del>- self.runtest(select([table], table.c.id.in_(1, 2, 3)), </del><ins>+ self.runtest(select([table], table1.c.id.in_(1, 2, 3)), </ins><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid IN (:mytable_myid, :mytable_myid_1, :mytable_myid_2)") </span><span class="cx"> </span><del>- self.runtest(select([table], table.c.id.in_(select([table2.c.id]))), </del><ins>+ self.runtest(select([table], table1.c.id.in_(select([table2.c.id]))), </ins><span class="cx"> "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid IN (SELECT myothertable.otherid AS id FROM myothertable)") </span><span class="cx"> </span><span class="cx"> def testlateargs(self): </span><span class="cx"> """tests that a SELECT clause will have extra "WHERE" clauses added to it at compile time if extra arguments </span><span class="cx"> are sent""" </span><span class="cx"> </span><del>- self.runtest(table.select(), "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.name = :mytable_name AND mytable.myid = :mytable_myid", params={'id':'3', 'name':'jack'}) </del><ins>+ self.runtest(table1.select(), "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.name = :mytable_name AND mytable.myid = :mytable_myid", params={'id':'3', 'name':'jack'}) </ins><span class="cx"> </span><del>- self.runtest(table.select(table.c.name=='jack'), "SELECT mytable.myid, mytable.name, mytable.... [truncated message content] |
From: <co...@sq...> - 2006-02-25 01:12:44
|
<!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>[1029] sqlalchemy/branches/sql_rearrangement/: branch where we're going to reoragnize sql/schema packages and simplify</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1029</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-24 19:12:33 -0600 (Fri, 24 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>branch where we're going to reoragnize sql/schema packages and simplify</pre> <h3>Added Paths</h3> <ul> <li>sqlalchemy/branches/sql_rearrangement/</li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchessql_rearrangementfromrev1028sqlalchemytrunk"></a> <div class="copfile"><h4>Copied: sqlalchemy/branches/sql_rearrangement (from rev 1028, sqlalchemy/trunk) ( => )</h4> <pre class="diff"><span> <span class="info"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-24 17:12:20
|
<!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>[1028] sqlalchemy/trunk: tentative fix for oracle row_number over syntax</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1028</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-24 11:12:02 -0600 (Fri, 24 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>tentative fix for oracle row_number over syntax</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesoraclepy">sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1027 => 1028)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-02-24 17:01:56 UTC (rev 1027) +++ sqlalchemy/trunk/CHANGES 2006-02-24 17:12:02 UTC (rev 1028) </span><span class="lines">@@ -1,4 +1,5 @@ </span><span class="cx"> 0.1.3 </span><ins>+- fix to Oracle "row_number over" clause with mulitple tables </ins><span class="cx"> - mapper.get() was not selecting multiple-keyed objects if the mapper's table was a join, </span><span class="cx"> such as in an inheritance relationship, this is fixed. </span><span class="cx"> 0.1.2 </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasesoraclepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py (1027 => 1028)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-02-24 17:01:56 UTC (rev 1027) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-02-24 17:12:02 UTC (rev 1028) </span><span class="lines">@@ -212,7 +212,8 @@ </span><span class="cx"> if hasattr(select, "order_by_clause"): </span><span class="cx"> orderby = self.strings[select.order_by_clause] </span><span class="cx"> else: </span><del>- orderby = "rowid ASC" </del><ins>+ # TODO: try to get "oid_column" to be used here + orderby = "%s.rowid ASC" % select.froms[0].id </ins><span class="cx"> select.append_column(sql.ColumnClause("ROW_NUMBER() OVER (ORDER BY %s)" % orderby).label("ora_rn")) </span><span class="cx"> limitselect = sql.select([c for c in select.c if c.key!='ora_rn']) </span><span class="cx"> if select.offset is not None: </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-24 17:02:05
|
<!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>[1027] sqlalchemy/trunk/CHANGES: update</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1027</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-24 11:01:56 -0600 (Fri, 24 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>update</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1026 => 1027)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-02-24 16:54:30 UTC (rev 1026) +++ sqlalchemy/trunk/CHANGES 2006-02-24 17:01:56 UTC (rev 1027) </span><span class="lines">@@ -1,3 +1,6 @@ </span><ins>+0.1.3 +- mapper.get() was not selecting multiple-keyed objects if the mapper's table was a join, +such as in an inheritance relationship, this is fixed. </ins><span class="cx"> 0.1.2 </span><span class="cx"> - fixed a recursive call in schema that was somehow running 994 times then returning </span><span class="cx"> normally. broke nothing, slowed down everything. thanks to jpellerin for finding this. </span></span></pre> </div> </div> </body> </html> |
<!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>[1026] sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py: get() method needs to use the full table, not just the 'primary' table, to get the full list of primary key cols</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1026</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-24 10:54:30 -0600 (Fri, 24 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>get() method needs to use the full table, not just the 'primary' table, to get the full list of primary key cols</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemymappingmapperpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1025 => 1026)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-02-24 00:29:33 UTC (rev 1025) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-02-24 16:54:30 UTC (rev 1026) </span><span class="lines">@@ -274,7 +274,7 @@ </span><span class="cx"> ident = key[2] </span><span class="cx"> i = 0 </span><span class="cx"> params = {} </span><del>- for primary_key in self.pks_by_table[self.primarytable]: </del><ins>+ for primary_key in self.pks_by_table[self.table]: </ins><span class="cx"> params["pk_"+primary_key.key] = ident[i] </span><span class="cx"> i += 1 </span><span class="cx"> try: </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-24 00:29:42
|
<!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>[1025] sqlalchemy/tags/rel_0_1_2/: release 0.1.2</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1025</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 18:29:33 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>release 0.1.2</pre> <h3>Added Paths</h3> <ul> <li>sqlalchemy/tags/rel_0_1_2/</li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytagsrel_0_1_2fromrev1024sqlalchemytrunk"></a> <div class="copfile"><h4>Copied: sqlalchemy/tags/rel_0_1_2 (from rev 1024, sqlalchemy/trunk) ( => )</h4> <pre class="diff"><span> <span class="info"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-24 00:28:27
|
<!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>[1024] sqlalchemy/trunk: fix to silent "recursive" bug in schema getattr that was somehow running only 994 times</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1024</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 18:28:10 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>fix to silent "recursive" bug in schema getattr that was somehow running only 994 times</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyschemapy">sqlalchemy/trunk/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemytrunksetuppy">sqlalchemy/trunk/setup.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1023 => 1024)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-02-23 02:48:01 UTC (rev 1023) +++ sqlalchemy/trunk/CHANGES 2006-02-24 00:28:10 UTC (rev 1024) </span><span class="lines">@@ -1,3 +1,6 @@ </span><ins>+0.1.2 +- fixed a recursive call in schema that was somehow running 994 times then returning +normally. broke nothing, slowed down everything. thanks to jpellerin for finding this. </ins><span class="cx"> 0.1.1 </span><span class="cx"> - small fix to Function class so that expressions with a func.foo() use the type of the </span><span class="cx"> Function object (i.e. the left side) as the type of the boolean expression, not the </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/schema.py (1023 => 1024)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-02-23 02:48:01 UTC (rev 1023) +++ sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-02-24 00:28:10 UTC (rev 1024) </span><span class="lines">@@ -49,7 +49,7 @@ </span><span class="cx"> def __getattr__(self, key): </span><span class="cx"> """proxies method calls to an underlying implementation object for methods not found </span><span class="cx"> locally""" </span><del>- if not hasattr(self, '_impl'): </del><ins>+ if not self.__dict__.has_key('_impl'): </ins><span class="cx"> raise AttributeError(key) </span><span class="cx"> return getattr(self._impl, key) </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunksetuppy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/setup.py (1023 => 1024)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/setup.py 2006-02-23 02:48:01 UTC (rev 1023) +++ sqlalchemy/trunk/setup.py 2006-02-24 00:28:10 UTC (rev 1024) </span><span class="lines">@@ -3,7 +3,7 @@ </span><span class="cx"> from setuptools import setup, find_packages </span><span class="cx"> </span><span class="cx"> setup(name = "SQLAlchemy", </span><del>- version = "0.1.1", </del><ins>+ version = "0.1.2", </ins><span class="cx"> description = "Database Abstraction Library", </span><span class="cx"> author = "Mike Bayer", </span><span class="cx"> author_email = "mi...@zz...", </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-24 00:19:13
|
<!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>[1034] sqlalchemy/tags/rel_0_1_1: my SVN problems were because i committed the fixes to the 0.1.1 tag, didnt check my "svn info".</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1034</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 18:19:00 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>my SVN problems were because i committed the fixes to the 0.1.1 tag, didnt check my "svn info". reverting 0.1.1 to its initial state</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytagsrel_0_1_1CHANGES">sqlalchemy/tags/rel_0_1_1/CHANGES</a></li> <li><a href="#sqlalchemytagsrel_0_1_1libsqlalchemyschemapy">sqlalchemy/tags/rel_0_1_1/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemytagsrel_0_1_1setuppy">sqlalchemy/tags/rel_0_1_1/setup.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytagsrel_0_1_1CHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/tags/rel_0_1_1/CHANGES (1033 => 1034)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/tags/rel_0_1_1/CHANGES 2006-02-24 00:16:04 UTC (rev 1033) +++ sqlalchemy/tags/rel_0_1_1/CHANGES 2006-02-24 00:19:00 UTC (rev 1034) </span><span class="lines">@@ -1,6 +1,3 @@ </span><del>-0.1.2 -- fixed a recursive call in schema that was somehow running 994 times then returning -normally. broke nothing, slowed down everything. thanks to jpellerin for finding this. </del><span class="cx"> 0.1.1 </span><span class="cx"> - small fix to Function class so that expressions with a func.foo() use the type of the </span><span class="cx"> Function object (i.e. the left side) as the type of the boolean expression, not the </span></span></pre></div> <a id="sqlalchemytagsrel_0_1_1libsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/tags/rel_0_1_1/lib/sqlalchemy/schema.py (1033 => 1034)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/tags/rel_0_1_1/lib/sqlalchemy/schema.py 2006-02-24 00:16:04 UTC (rev 1033) +++ sqlalchemy/tags/rel_0_1_1/lib/sqlalchemy/schema.py 2006-02-24 00:19:00 UTC (rev 1034) </span><span class="lines">@@ -49,7 +49,7 @@ </span><span class="cx"> def __getattr__(self, key): </span><span class="cx"> """proxies method calls to an underlying implementation object for methods not found </span><span class="cx"> locally""" </span><del>- if not self.__dict__.has_key('_impl'): </del><ins>+ if not hasattr(self, '_impl'): </ins><span class="cx"> raise AttributeError(key) </span><span class="cx"> return getattr(self._impl, key) </span><span class="cx"> </span><span class="lines">@@ -305,7 +305,7 @@ </span><span class="cx"> else: </span><span class="cx"> fk = self.foreign_key.copy() </span><span class="cx"> return Column(self.name, self.type, fk, self.default, key = self.key, primary_key = self.primary_key, nullable = self.nullable, hidden = self.hidden) </span><del>- </del><ins>+ </ins><span class="cx"> def _make_proxy(self, selectable, name = None): </span><span class="cx"> """creates a copy of this Column, initialized the way this Column is""" </span><span class="cx"> if self.foreign_key is None: </span></span></pre></div> <a id="sqlalchemytagsrel_0_1_1setuppy"></a> <div class="modfile"><h4>Modified: sqlalchemy/tags/rel_0_1_1/setup.py (1033 => 1034)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/tags/rel_0_1_1/setup.py 2006-02-24 00:16:04 UTC (rev 1033) +++ sqlalchemy/tags/rel_0_1_1/setup.py 2006-02-24 00:19:00 UTC (rev 1034) </span><span class="lines">@@ -3,7 +3,7 @@ </span><span class="cx"> from setuptools import setup, find_packages </span><span class="cx"> </span><span class="cx"> setup(name = "SQLAlchemy", </span><del>- version = "0.1.2", </del><ins>+ version = "0.1.1", </ins><span class="cx"> description = "Database Abstraction Library", </span><span class="cx"> author = "Mike Bayer", </span><span class="cx"> author_email = "mi...@zz...", </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-24 00:16:14
|
<!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>[1033] sqlalchemy/trunk: crap, now i figured it out.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1033</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 18:16:04 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>crap, now i figured it out. committing rel 0.1.2 changes to the trunk...</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyschemapy">sqlalchemy/trunk/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemytrunksetuppy">sqlalchemy/trunk/setup.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1032 => 1033)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-02-23 23:58:26 UTC (rev 1032) +++ sqlalchemy/trunk/CHANGES 2006-02-24 00:16:04 UTC (rev 1033) </span><span class="lines">@@ -1,3 +1,6 @@ </span><ins>+0.1.2 +- fixed a recursive call in schema that was somehow running 994 times then returning +normally. broke nothing, slowed down everything. thanks to jpellerin for finding this. </ins><span class="cx"> 0.1.1 </span><span class="cx"> - small fix to Function class so that expressions with a func.foo() use the type of the </span><span class="cx"> Function object (i.e. the left side) as the type of the boolean expression, not the </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/schema.py (1032 => 1033)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-02-23 23:58:26 UTC (rev 1032) +++ sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-02-24 00:16:04 UTC (rev 1033) </span><span class="lines">@@ -49,7 +49,7 @@ </span><span class="cx"> def __getattr__(self, key): </span><span class="cx"> """proxies method calls to an underlying implementation object for methods not found </span><span class="cx"> locally""" </span><del>- if not hasattr(self, '_impl'): </del><ins>+ if not self.__dict__.has_key('_impl'): </ins><span class="cx"> raise AttributeError(key) </span><span class="cx"> return getattr(self._impl, key) </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunksetuppy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/setup.py (1032 => 1033)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/setup.py 2006-02-23 23:58:26 UTC (rev 1032) +++ sqlalchemy/trunk/setup.py 2006-02-24 00:16:04 UTC (rev 1033) </span><span class="lines">@@ -3,7 +3,7 @@ </span><span class="cx"> from setuptools import setup, find_packages </span><span class="cx"> </span><span class="cx"> setup(name = "SQLAlchemy", </span><del>- version = "0.1.1", </del><ins>+ version = "0.1.2", </ins><span class="cx"> description = "Database Abstraction Library", </span><span class="cx"> author = "Mike Bayer", </span><span class="cx"> author_email = "mi...@zz...", </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 23:58:34
|
<!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>[1032] sqlalchemy/tags/rel_0_1_2: ok i have no idea wtf is wrong with SVN, none of my committed changes copied into the tag,</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1032</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 17:58:26 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>ok i have no idea wtf is wrong with SVN, none of my committed changes copied into the tag, but here they are now</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytagsrel_0_1_2CHANGES">sqlalchemy/tags/rel_0_1_2/CHANGES</a></li> <li><a href="#sqlalchemytagsrel_0_1_2libsqlalchemyschemapy">sqlalchemy/tags/rel_0_1_2/lib/sqlalchemy/schema.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytagsrel_0_1_2CHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/tags/rel_0_1_2/CHANGES (1031 => 1032)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/tags/rel_0_1_2/CHANGES 2006-02-23 23:54:25 UTC (rev 1031) +++ sqlalchemy/tags/rel_0_1_2/CHANGES 2006-02-23 23:58:26 UTC (rev 1032) </span><span class="lines">@@ -1,3 +1,6 @@ </span><ins>+0.1.2 +- fixed a recursive call in schema that was somehow running 994 times then returning +normally. broke nothing, slowed down everything. thanks to jpellerin for finding this. </ins><span class="cx"> 0.1.1 </span><span class="cx"> - small fix to Function class so that expressions with a func.foo() use the type of the </span><span class="cx"> Function object (i.e. the left side) as the type of the boolean expression, not the </span></span></pre></div> <a id="sqlalchemytagsrel_0_1_2libsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/tags/rel_0_1_2/lib/sqlalchemy/schema.py (1031 => 1032)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/tags/rel_0_1_2/lib/sqlalchemy/schema.py 2006-02-23 23:54:25 UTC (rev 1031) +++ sqlalchemy/tags/rel_0_1_2/lib/sqlalchemy/schema.py 2006-02-23 23:58:26 UTC (rev 1032) </span><span class="lines">@@ -49,7 +49,7 @@ </span><span class="cx"> def __getattr__(self, key): </span><span class="cx"> """proxies method calls to an underlying implementation object for methods not found </span><span class="cx"> locally""" </span><del>- if not hasattr(self, '_impl'): </del><ins>+ if not self.__dict__.has_key('_impl'): </ins><span class="cx"> raise AttributeError(key) </span><span class="cx"> return getattr(self._impl, key) </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 23:54:32
|
<!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>[1031] sqlalchemy/tags/rel_0_1_2/setup.py: 0.1.2, sorry, i cant really figure out SVN tagging</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1031</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 17:54:25 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>0.1.2, sorry, i cant really figure out SVN tagging</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytagsrel_0_1_2setuppy">sqlalchemy/tags/rel_0_1_2/setup.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytagsrel_0_1_2setuppy"></a> <div class="modfile"><h4>Modified: sqlalchemy/tags/rel_0_1_2/setup.py (1030 => 1031)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/tags/rel_0_1_2/setup.py 2006-02-23 23:52:43 UTC (rev 1030) +++ sqlalchemy/tags/rel_0_1_2/setup.py 2006-02-23 23:54:25 UTC (rev 1031) </span><span class="lines">@@ -3,7 +3,7 @@ </span><span class="cx"> from setuptools import setup, find_packages </span><span class="cx"> </span><span class="cx"> setup(name = "SQLAlchemy", </span><del>- version = "0.1.1", </del><ins>+ version = "0.1.2", </ins><span class="cx"> description = "Database Abstraction Library", </span><span class="cx"> author = "Mike Bayer", </span><span class="cx"> author_email = "mi...@zz...", </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 23:52:51
|
<!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>[1030] sqlalchemy/tags/rel_0_1_2/: releasing 0.1.2...</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1030</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 17:52:43 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>releasing 0.1.2...</pre> <h3>Added Paths</h3> <ul> <li>sqlalchemy/tags/rel_0_1_2/</li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytagsrel_0_1_2fromrev1029sqlalchemytrunk"></a> <div class="copfile"><h4>Copied: sqlalchemy/tags/rel_0_1_2 (from rev 1029, sqlalchemy/trunk) ( => )</h4> <pre class="diff"><span> <span class="info"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 23:50:19
|
<!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>[1029] sqlalchemy/tags/rel_0_1_2/: um..</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1029</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 17:50:09 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>um..</pre> <h3>Removed Paths</h3> <ul> <li>sqlalchemy/tags/rel_0_1_2/</li> </ul> </div> <div id="patch"> <h3>Diff</h3> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 23:48:20
|
<!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>[1028] sqlalchemy/tags/rel_0_1_2/: releasing getattr loop fix</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1028</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 17:48:10 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>releasing getattr loop fix</pre> <h3>Added Paths</h3> <ul> <li>sqlalchemy/tags/rel_0_1_2/</li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytagsrel_0_1_2fromrev1027sqlalchemytrunk"></a> <div class="copfile"><h4>Copied: sqlalchemy/tags/rel_0_1_2 (from rev 1027, sqlalchemy/trunk) ( => )</h4> <pre class="diff"><span> <span class="info"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 23:47:38
|
<!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>[1027] sqlalchemy/tags/rel_0_1_2/: forgot the setup.py</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1027</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 17:47:31 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>forgot the setup.py</pre> <h3>Removed Paths</h3> <ul> <li>sqlalchemy/tags/rel_0_1_2/</li> </ul> </div> <div id="patch"> <h3>Diff</h3> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 23:47:05
|
<!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>[1026] sqlalchemy/tags/rel_0_1_1/setup.py: rel 0.1.2</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1026</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 17:46:57 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>rel 0.1.2</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytagsrel_0_1_1setuppy">sqlalchemy/tags/rel_0_1_1/setup.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytagsrel_0_1_1setuppy"></a> <div class="modfile"><h4>Modified: sqlalchemy/tags/rel_0_1_1/setup.py (1025 => 1026)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/tags/rel_0_1_1/setup.py 2006-02-23 23:45:22 UTC (rev 1025) +++ sqlalchemy/tags/rel_0_1_1/setup.py 2006-02-23 23:46:57 UTC (rev 1026) </span><span class="lines">@@ -3,7 +3,7 @@ </span><span class="cx"> from setuptools import setup, find_packages </span><span class="cx"> </span><span class="cx"> setup(name = "SQLAlchemy", </span><del>- version = "0.1.1", </del><ins>+ version = "0.1.2", </ins><span class="cx"> description = "Database Abstraction Library", </span><span class="cx"> author = "Mike Bayer", </span><span class="cx"> author_email = "mi...@zz...", </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 23:45:31
|
<!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>[1025] sqlalchemy/tags/rel_0_1_2/: releasing 0.1.2 to fix recursive getattr loop</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1025</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 17:45:22 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>releasing 0.1.2 to fix recursive getattr loop</pre> <h3>Added Paths</h3> <ul> <li>sqlalchemy/tags/rel_0_1_2/</li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytagsrel_0_1_2fromrev1024sqlalchemytrunk"></a> <div class="copfile"><h4>Copied: sqlalchemy/tags/rel_0_1_2 (from rev 1024, sqlalchemy/trunk) ( => )</h4> <pre class="diff"><span> <span class="info"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 23:40:27
|
<!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>[1024] sqlalchemy/tags/rel_0_1_1: fixed recursive getattr condition</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1024</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-23 17:40:13 -0600 (Thu, 23 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>fixed recursive getattr condition</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytagsrel_0_1_1CHANGES">sqlalchemy/tags/rel_0_1_1/CHANGES</a></li> <li><a href="#sqlalchemytagsrel_0_1_1libsqlalchemyschemapy">sqlalchemy/tags/rel_0_1_1/lib/sqlalchemy/schema.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytagsrel_0_1_1CHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/tags/rel_0_1_1/CHANGES (1023 => 1024)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/tags/rel_0_1_1/CHANGES 2006-02-23 02:48:01 UTC (rev 1023) +++ sqlalchemy/tags/rel_0_1_1/CHANGES 2006-02-23 23:40:13 UTC (rev 1024) </span><span class="lines">@@ -1,3 +1,6 @@ </span><ins>+0.1.2 +- fixed a recursive call in schema that was somehow running 994 times then returning +normally. broke nothing, slowed down everything. thanks to jpellerin for finding this. </ins><span class="cx"> 0.1.1 </span><span class="cx"> - small fix to Function class so that expressions with a func.foo() use the type of the </span><span class="cx"> Function object (i.e. the left side) as the type of the boolean expression, not the </span></span></pre></div> <a id="sqlalchemytagsrel_0_1_1libsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/tags/rel_0_1_1/lib/sqlalchemy/schema.py (1023 => 1024)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/tags/rel_0_1_1/lib/sqlalchemy/schema.py 2006-02-23 02:48:01 UTC (rev 1023) +++ sqlalchemy/tags/rel_0_1_1/lib/sqlalchemy/schema.py 2006-02-23 23:40:13 UTC (rev 1024) </span><span class="lines">@@ -49,7 +49,7 @@ </span><span class="cx"> def __getattr__(self, key): </span><span class="cx"> """proxies method calls to an underlying implementation object for methods not found </span><span class="cx"> locally""" </span><del>- if not hasattr(self, '_impl'): </del><ins>+ if not self.__dict__.has_key('_impl'): </ins><span class="cx"> raise AttributeError(key) </span><span class="cx"> return getattr(self._impl, key) </span><span class="cx"> </span><span class="lines">@@ -305,7 +305,7 @@ </span><span class="cx"> else: </span><span class="cx"> fk = self.foreign_key.copy() </span><span class="cx"> return Column(self.name, self.type, fk, self.default, key = self.key, primary_key = self.primary_key, nullable = self.nullable, hidden = self.hidden) </span><del>- </del><ins>+ </ins><span class="cx"> def _make_proxy(self, selectable, name = None): </span><span class="cx"> """creates a copy of this Column, initialized the way this Column is""" </span><span class="cx"> if self.foreign_key is None: </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 02:48:09
|
<!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>[1023] sqlalchemy/tags/rel_0_1_1/: release 0.1.1</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1023</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-22 20:48:01 -0600 (Wed, 22 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>release 0.1.1</pre> <h3>Added Paths</h3> <ul> <li>sqlalchemy/tags/rel_0_1_1/</li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytagsrel_0_1_1fromrev1022sqlalchemytrunk"></a> <div class="copfile"><h4>Copied: sqlalchemy/tags/rel_0_1_1 (from rev 1022, sqlalchemy/trunk) ( => )</h4> <pre class="diff"><span> <span class="info"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 02:47:17
|
<!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>[1022] sqlalchemy/trunk/setup.py: release time</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1022</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-22 20:47:07 -0600 (Wed, 22 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>release time</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunksetuppy">sqlalchemy/trunk/setup.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunksetuppy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/setup.py (1021 => 1022)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/setup.py 2006-02-23 02:43:14 UTC (rev 1021) +++ sqlalchemy/trunk/setup.py 2006-02-23 02:47:07 UTC (rev 1022) </span><span class="lines">@@ -3,7 +3,7 @@ </span><span class="cx"> from setuptools import setup, find_packages </span><span class="cx"> </span><span class="cx"> setup(name = "SQLAlchemy", </span><del>- version = "0.1.0", </del><ins>+ version = "0.1.1", </ins><span class="cx"> description = "Database Abstraction Library", </span><span class="cx"> author = "Mike Bayer", </span><span class="cx"> author_email = "mi...@zz...", </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 02:43:28
|
<!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>[1021] sqlalchemy/trunk/CHANGES: update</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1021</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-22 20:43:14 -0600 (Wed, 22 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>update</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkCHANGES">sqlalchemy/trunk/CHANGES</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkCHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/CHANGES (1020 => 1021)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/CHANGES 2006-02-23 01:32:26 UTC (rev 1020) +++ sqlalchemy/trunk/CHANGES 2006-02-23 02:43:14 UTC (rev 1021) </span><span class="lines">@@ -1,4 +1,32 @@ </span><span class="cx"> 0.1.1 </span><ins>+- small fix to Function class so that expressions with a func.foo() use the type of the +Function object (i.e. the left side) as the type of the boolean expression, not the +other side which is more of a moving target (changeset 1020). +- creating self-referring mappers with backrefs slightly easier (but still not that easy - +changeset 1019) +- fixes to one-to-one mappings (changeset 1015) +- psycopg1 date/time issue with None fixed (changeset 1005) +- two issues related to postgres, which doesnt want to give you the "lastrowid" +since oids are deprecated: + * postgres database-side defaults that are on primary key cols *do* execute +explicitly beforehand, even though thats not the idea of a PassiveDefault. this is +because sequences on columns get reflected as PassiveDefaults, but need to be explicitly +executed on a primary key col so we know what we just inserted. + * if you did add a row that has a bunch of database-side defaults on it, +and the PassiveDefault thing was working the old way, i.e. they just execute on +the DB side, the "cant get the row back without an OID" exception that occurred +also will not happen unless someone (usually the ORM) explicitly asks for it. +- fixed a glitch with engine.execute_compiled where it was making a second +ResultProxy that just got thrown away. +- began to implement newer logic in object properities. you can now say +myclass.attr.property, which will give you the PropertyLoader corresponding to that +attribute, i.e. myclass.mapper.props['attr'] +- eager loading has been internally overhauled to use aliases at all times. more +complicated chains of eager loads can now be created without any need for explicit +"use aliases"-type instructions. EagerLoader code is also much simpler now. +- a new somewhat experimental flag "use_update" added to relations, indicates that +this relationship should be handled by a second UPDATE statement, either after a +primary INSERT or before a primary DELETE. handles circular row dependencies. </ins><span class="cx"> - added exceptions module, all raised exceptions (except for some </span><span class="cx"> KeyError/AttributeError exceptions) descend from these classes. </span><span class="cx"> - fix to date types with MySQL, returned timedelta converted to datetime.time </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-23 01:32:40
|
<!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>[1020] sqlalchemy/trunk/lib/sqlalchemy/sql.py: Function needed compare_type so that its type is set as the type in boolean expressions</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1020</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-22 19:32:26 -0600 (Wed, 22 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>Function needed compare_type so that its type is set as the type in boolean expressions</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1019 => 1020)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-02-22 08:50:45 UTC (rev 1019) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-02-23 01:32:26 UTC (rev 1020) </span><span class="lines">@@ -796,7 +796,9 @@ </span><span class="cx"> return select([self]) </span><span class="cx"> def hash_key(self): </span><span class="cx"> return self.name + "(" + string.join([c.hash_key() for c in self.clauses], ", ") + ")" </span><del>- </del><ins>+ def _compare_type(self, obj): + return self.type + </ins><span class="cx"> class BinaryClause(ClauseElement): </span><span class="cx"> """represents two clauses with an operator in between""" </span><span class="cx"> def __init__(self, left, right, operator, type=None): </span></span></pre> </div> </div> </body> </html> |
<!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>[1019] sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py: moved iteration of props so that props can set up self-referring backref properties without getting a "list changed during iteration" error</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1019</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-22 02:50:45 -0600 (Wed, 22 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>moved iteration of props so that props can set up self-referring backref properties without getting a "list changed during iteration" error</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemymappingmapperpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1018 => 1019)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-02-22 08:13:25 UTC (rev 1018) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-02-22 08:50:45 UTC (rev 1019) </span><span class="lines">@@ -171,7 +171,8 @@ </span><span class="cx"> self.props[key].parent = self </span><span class="cx"> self.props[key].key = None # force re-init </span><span class="cx"> </span><del>- for key, prop in self.props.iteritems(): </del><ins>+ l = [(key, prop) for key, prop in self.props.iteritems()] + for key, prop in l: </ins><span class="cx"> if getattr(prop, 'key', None) is None: </span><span class="cx"> prop.init(key, self) </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-02-22 08:13:35
|
<!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>[1018] sqlalchemy/trunk/test/alltests.py: test commit</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1018</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-02-22 02:13:25 -0600 (Wed, 22 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>test commit</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunktestalltestspy">sqlalchemy/trunk/test/alltests.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunktestalltestspy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/alltests.py (1017 => 1018)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/alltests.py 2006-02-22 07:47:58 UTC (rev 1017) +++ sqlalchemy/trunk/test/alltests.py 2006-02-22 08:13:25 UTC (rev 1018) </span><span class="lines">@@ -3,6 +3,8 @@ </span><span class="cx"> </span><span class="cx"> testbase.echo = False </span><span class="cx"> </span><ins>+#test + </ins><span class="cx"> def suite(): </span><span class="cx"> modules_to_test = ( </span><span class="cx"> # core utilities </span></span></pre> </div> </div> </body> </html> |