From: Mike Bayer Date: Sat, 22 Oct 2005 23:25:06 +0000 (+0000) Subject: oid oid oid orderby lala X-Git-Tag: rel_0_1_0~470 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dbf38046eb69d3de25828650af2a403ddff4eb9d;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git oid oid oid orderby lala --- diff --git a/lib/sqlalchemy/mapper.py b/lib/sqlalchemy/mapper.py index 5e39e10f6e..c41c5edb01 100644 --- a/lib/sqlalchemy/mapper.py +++ b/lib/sqlalchemy/mapper.py @@ -486,6 +486,7 @@ class Mapper(object): def _compile(self, whereclause = None, order_by = None, **options): statement = sql.select([self.table], whereclause, order_by = order_by) + statement.order_by(self.primarytable.rowid_column) # plugin point for key, value in self.props.iteritems(): value.setup(key, statement, **options) @@ -1024,8 +1025,10 @@ class EagerLoader(PropertyLoader): print self.target.name print str(self.primaryjoin) statement._outerjoin = sql.outerjoin(towrap, self.secondary, self.primaryjoin).outerjoin(self.target, self.secondaryjoin) + statement.order_by(self.secondary.rowid_column) else: statement._outerjoin = towrap.outerjoin(self.target, self.primaryjoin) + statement.order_by(self.target.rowid_column) statement.append_from(statement._outerjoin) statement.append_column(self.target) diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index 47db789f4b..68593e810b 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -124,6 +124,7 @@ class Column(SchemaItem): self.key = kwargs.get('key', name) self.primary_key = kwargs.get('primary_key', False) self.nullable = kwargs.get('nullable', not self.primary_key) + self.hidden = kwargs.get('hidden', False) self.foreign_key = None self.sequence = None self._orig = None @@ -132,9 +133,10 @@ class Column(SchemaItem): engine = property(lambda s: s.table.engine) def _set_parent(self, table): - table.columns[self.key] = self - if self.primary_key: - table.primary_keys.append(self) + if not self.hidden: + table.columns[self.key] = self + if self.primary_key: + table.primary_keys.append(self) self.table = table if self.table.engine is not None: self.type = self.table.engine.type_descriptor(self.type) diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py index b2272541d1..bcb02efa49 100644 --- a/lib/sqlalchemy/sql.py +++ b/lib/sqlalchemy/sql.py @@ -509,7 +509,8 @@ class Join(Selectable): # TODO: if no onclause, do NATURAL JOIN self.onclause = onclause self.isouter = isouter - + self.rowid_column = self.left.rowid_column + primary_keys = property (lambda self: [c for c in self.left.columns if c.primary_key] + [c for c in self.right.columns if c.primary_key]) @@ -550,6 +551,7 @@ class Alias(Selectable): self.name = alias self.id = self.name self.count = 0 + self.rowid_column = self.selectable.rowid_column._make_proxy(self) for co in selectable.columns: co._make_proxy(self) @@ -622,9 +624,8 @@ class TableImpl(Selectable): def __init__(self, table): self.table = table self.id = self.table.name - self.rowid_column = schema.Column(self.table.engine.rowid_column_name(), types.Integer) + self.rowid_column = schema.Column(self.table.engine.rowid_column_name(), types.Integer, hidden=True) self.rowid_column._set_parent(table) - del self.table.c[self.rowid_column.key] def get_from_text(self): return self.table.name @@ -772,7 +773,11 @@ class Select(Selectable): visitor.visit_select(self) def order_by(self, *clauses): - self.append_clause("ORDER BY", ClauseList(*clauses)) + if not hasattr(self, 'order_by_clause'): + self.order_by_clause = ClauseList(*clauses) + self.append_clause("ORDER BY", self.order_by_clause) + else: + self.order_by_clause.clauses += clauses def select(self, whereclauses = None, **params): return select([self], whereclauses, **params) diff --git a/test/mapper.py b/test/mapper.py index 02b476c2d4..f53c9bcfb6 100644 --- a/test/mapper.py +++ b/test/mapper.py @@ -308,7 +308,7 @@ class EagerTest(MapperSuperTest): m = mapper(Item, items, properties = dict( keywords = relation(Keyword, keywords, itemkeywords, lazy = False), )) - l = m.select(order_by=[items.c.item_id, keywords.c.keyword_id]) + l = m.select() self.assert_result(l, Item, {'item_id' : 1, 'keywords' : (Keyword, [{'keyword_id' : 2}, {'keyword_id' : 4}, {'keyword_id' : 6}])}, {'item_id' : 2, 'keywords' : (Keyword, [{'keyword_id' : 2, 'name':'red'}, {'keyword_id' : 7, 'name':'square'}, {'keyword_id' : 5, 'name':'small'}])}, diff --git a/test/tables.py b/test/tables.py index 845077716c..1c9cf52973 100644 --- a/test/tables.py +++ b/test/tables.py @@ -10,8 +10,8 @@ __ALL__ = ['db', 'users', 'addresses', 'orders', 'orderitems', 'keywords', 'item ECHO = testbase.echo -#DBTYPE = 'sqlite_memory' -DBTYPE = 'postgres' +DBTYPE = 'sqlite_memory' +#DBTYPE = 'postgres' #DBTYPE = 'sqlite_file' if DBTYPE == 'sqlite_memory':