From a4ba9b5414ee3d18667b67d57a361845a8354d3c Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 28 Feb 2006 23:18:43 +0000 Subject: [PATCH] oid inits at compilation time/when needed again, added a unit test --- lib/sqlalchemy/ext/proxy.py | 6 ++---- lib/sqlalchemy/sql.py | 8 ++++---- test/proxy_engine.py | 11 +++++++++++ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/sqlalchemy/ext/proxy.py b/lib/sqlalchemy/ext/proxy.py index d9a830c66e..783ea969e8 100644 --- a/lib/sqlalchemy/ext/proxy.py +++ b/lib/sqlalchemy/ext/proxy.py @@ -28,10 +28,8 @@ class BaseProxyEngine(object): return "%s(%s)" % (self.__class__.__name__, id(self)) def oid_column_name(self): - # NOTE: setting up mappers fails unless the proxy engine returns - # something for oid column name, and the call happens too early - # to proxy, so effecticely no oids are allowed when using - # proxy engine + # oid_column should not be requested before the engine is connected. + # it should ideally only be called at query compilation time. e= self.get_engine() if e is None: return None diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py index f905da5834..6b574861be 100644 --- a/lib/sqlalchemy/sql.py +++ b/lib/sqlalchemy/sql.py @@ -827,7 +827,9 @@ class Join(FromClause): else: self.onclause = onclause self.isouter = isouter - self.oid_column = self.left.oid_column + + oid_column = property(lambda s:s.left.oid_column) + def _exportable_columns(self): return [c for c in self.left.columns] + [c for c in self.right.columns] def _proxy_column(self, column): @@ -1001,6 +1003,7 @@ class TableClause(FromClause): if self.engine.oid_column_name() is not None: self._oid_column = schema.Column(self.engine.oid_column_name(), sqltypes.Integer, hidden=True) self._oid_column._set_parent(self) + self._orig_columns()[self._oid_column.original] = self._oid_column else: self._oid_column = None return self._oid_column @@ -1011,9 +1014,6 @@ class TableClause(FromClause): self._orig_cols= {} for c in self.columns: self._orig_cols[c.original] = c - oid = self.oid_column - if oid is not None: - self._orig_cols[oid.original] = oid return self._orig_cols columns = property(lambda s:s._columns) c = property(lambda s:s._columns) diff --git a/test/proxy_engine.py b/test/proxy_engine.py index 2ef19fc075..14cd1902bc 100644 --- a/test/proxy_engine.py +++ b/test/proxy_engine.py @@ -22,6 +22,17 @@ class User(object): pass +class ConstructTest(PersistTest): + """tests that we can build SQL constructs without engine-specific parameters, particulary + oid_column, being needed, as the proxy engine is usually not connected yet.""" + def test_join(self): + engine = ProxyEngine() + t = Table('table1', engine, + Column('col1', Integer, primary_key=True)) + t2 = Table('table2', engine, + Column('col2', Integer, ForeignKey('table1.col1'))) + j = join(t, t2) + class ProxyEngineTest1(PersistTest): def setUp(self): -- 2.47.2