]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
this should be just about 100% coverage
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 5 Jul 2009 00:18:21 +0000 (00:18 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 5 Jul 2009 00:18:21 +0000 (00:18 +0000)
18 files changed:
06CHANGES
lib/sqlalchemy/dialects/oracle/base.py
lib/sqlalchemy/schema.py
lib/sqlalchemy/sql/compiler.py
lib/sqlalchemy/test/requires.py
test/orm/test_defaults.py
test/orm/test_eager_relations.py
test/orm/test_lazy_relations.py
test/orm/test_mapper.py
test/orm/test_merge.py
test/orm/test_naturalpks.py
test/orm/test_pickled.py
test/orm/test_query.py
test/orm/test_relationships.py
test/orm/test_scoping.py
test/orm/test_selectable.py
test/orm/test_session.py
test/orm/test_unitofwork.py

index a726ec22aa3cb979445cb5bebb40e9da34bb7f02..8b236fcbd5b48f873e181c854189a24e94047d80 100644 (file)
--- a/06CHANGES
+++ b/06CHANGES
     - support for cx_Oracle's "native unicode" mode which does not require NLS_LANG
       to be set.  Use the latest 5.0.2 or later of cx_oracle.  
     - an NCLOB type is added to the base types.
-    
+    - func.char_length is a generic function for LENGTH
+    - ForeignKey() which includes onupdate=<value> will emit a warning, not 
+      emit ON UPDATE CASCADE which is unsupported by oracle
+      
 - new dialects
     - pg8000
     - pyodbc+mysql
index c8f33531291058cce6f1f0ad506bd692817476dc..dff0f52fac469cfc1cc08aab91874202c13d5d7a 100644 (file)
@@ -81,6 +81,17 @@ http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html .  Note tha
 this was stepping into the bounds of optimization that is better left on the DBA side, but this
 prefix can be added by enabling the optimize_limits=True flag on create_engine().
 
+ON UPDATE CASCADE
+-----------------
+
+Oracle doesn't have native ON UPDATE CASCADE functionality.  A trigger based solution 
+is available at http://asktom.oracle.com/tkyte/update_cascade/index.html .
+
+When using the SQLAlchemy ORM, the ORM has limited ability to manually issue
+cascading updates - specify ForeignKey objects using the 
+"deferrable=True, initially='deferred'" keyword arguments,
+and specify "passive_updates=False" on each relation().
+
 Oracle 8 Compatibility
 ----------------------
 
@@ -164,8 +175,10 @@ class OracleTypeCompiler(compiler.GenericTypeCompiler):
         return self.visit_DATE(type_)
     
     def visit_float(self, type_):
-        #return "NUMERIC(%(precision)s, %(scale)s)" % {'precision': type_.precision, 'scale' : 2}
-        return self.visit_NUMERIC(type_)
+        if type_.precision is None:
+            return "NUMERIC"
+        else:
+            return "NUMERIC(%(precision)s, %(scale)s)" % {'precision': type_.precision, 'scale' : 2}
         
     def visit_unicode(self, type_):
         return self.visit_NVARCHAR(type_)
@@ -207,6 +220,9 @@ class OracleCompiler(compiler.SQLCompiler):
     
     def visit_now_func(self, fn, **kw):
         return "CURRENT_TIMESTAMP"
+    
+    def visit_char_length_func(self, fn, **kw):
+        return "LENGTH" + self.function_argspec(fn, **kw)
         
     def visit_match_op(self, binary, **kw):
         return "CONTAINS (%s, %s)" % (self.process(binary.left), self.process(binary.right))
@@ -369,6 +385,21 @@ class OracleDDLCompiler(compiler.DDLCompiler):
     def visit_drop_sequence(self, drop):
         return "DROP SEQUENCE %s" % self.preparer.format_sequence(drop.element)
 
+    def define_constraint_cascades(self, constraint):
+        text = ""
+        if constraint.ondelete is not None:
+            text += " ON DELETE %s" % constraint.ondelete
+            
+        # oracle has no ON UPDATE CASCADE - 
+        # its only available via triggers http://asktom.oracle.com/tkyte/update_cascade/index.html
+        if constraint.onupdate is not None:
+            util.warn(
+                "Oracle does not contain native UPDATE CASCADE "
+                 "functionality - onupdates will not be rendered for foreign keys."
+                 "Consider using deferrable=True, initially='deferred' or triggers.")
+        
+        return text
+
 class OracleDefaultRunner(base.DefaultRunner):
     def visit_sequence(self, seq):
         return self.execute_string("SELECT " + self.dialect.identifier_preparer.format_sequence(seq) + ".nextval FROM DUAL", {})
index 855bf71ffe22a2a0c2f5ec539b44d585beecb2b5..df39a658fde96e4d2f8cd2ec1ceef0d77ea8b54b 100644 (file)
@@ -1955,9 +1955,9 @@ class DDLElement(expression.ClauseElement):
 
     def _check_ddl_on(self, on):
         if (on is not None and
-            (not isinstance(on, basestring) and not util.callable(on))):
+            (not isinstance(on, (basestring, tuple, list, set)) and not util.callable(on))):
             raise exc.ArgumentError(
-                "Expected the name of a database dialect or a callable for "
+                "Expected the name of a database dialect, a tuple of names, or a callable for "
                 "'on' criteria, got type '%s'." % type(on).__name__)
 
     def _should_execute(self, event, schema_item, bind, **kw):
@@ -1965,6 +1965,8 @@ class DDLElement(expression.ClauseElement):
             return True
         elif isinstance(self.on, basestring):
             return self.on == bind.engine.name
+        elif isinstance(self.on, (tuple, list, set)):
+            return bind.engine.name in self.on
         else:
             return self.on(event, schema_item, bind, **kw)
 
@@ -2021,12 +2023,16 @@ class DDL(DDLElement):
           SQL bind parameters are not available in DDL statements.
 
         on
-          Optional filtering criteria.  May be a string or a callable
+          Optional filtering criteria.  May be a string, tuple or a callable
           predicate.  If a string, it will be compared to the name of the
           executing database dialect::
 
             DDL('something', on='postgres')
-
+        
+          If a tuple, specifies multiple dialect names:
+          
+            DDL('something', on=('postgres', 'mysql'))
+            
           If a callable, it will be invoked with three positional arguments
           as well as optional keyword arguments:
 
index 237c8722c008a710d9bc8ffc1876733dc71a74a0..cab7659c43b35e0eaee44977b75a1bb188053b18 100644 (file)
@@ -1005,10 +1005,7 @@ class DDLCompiler(engine.Compiled):
             ', '.join(preparer.quote(f.column.name, f.column.quote)
                       for f in constraint._elements.values())
         )
-        if constraint.ondelete is not None:
-            text += " ON DELETE %s" % constraint.ondelete
-        if constraint.onupdate is not None:
-            text += " ON UPDATE %s" % constraint.onupdate
+        text += self.define_constraint_cascades(constraint)
         text += self.define_constraint_deferrability(constraint)
         return text
 
@@ -1020,6 +1017,14 @@ class DDLCompiler(engine.Compiled):
         text += self.define_constraint_deferrability(constraint)
         return text
 
+    def define_constraint_cascades(self, constraint):
+        text = ""
+        if constraint.ondelete is not None:
+            text += " ON DELETE %s" % constraint.ondelete
+        if constraint.onupdate is not None:
+            text += " ON UPDATE %s" % constraint.onupdate
+        return text
+        
     def define_constraint_deferrability(self, constraint):
         text = ""
         if constraint.deferrable is not None:
index a3e96790414cb782ea6374859301fe697ce74c10..98408ace980c003515c4e4b9b02b14ee869c7620 100644 (file)
@@ -61,9 +61,19 @@ def row_triggers(fn):
         # no access to same table
         no_support('mysql', 'requires SUPER priv'),
         exclude('mysql', '<', (5, 0, 10), 'not supported by database'),
-        no_support('postgres', 'not supported by database: no statements'),
+        
+        # huh?  TODO: implement triggers for PG tests, remove this
+        no_support('postgres', 'PG triggers need to be implemented for tests'),  
         )
 
+def correlated_outer_joins(fn):
+    """Target must support an outer join to a subquery which correlates to the parent."""
+    
+    return _chain_decorators_on(
+        fn,
+        no_support('oracle', 'Raises "ORA-01799: a column may not be outer-joined to a subquery"')
+    )
+    
 def savepoints(fn):
     """Target database must support savepoints."""
     return _chain_decorators_on(
index 56571037e43dd2b9807da83c65470603fb175702..5379c9714995b5d46170bc2d014a12fba1970b7d 100644 (file)
@@ -33,17 +33,23 @@ class TriggerDefaultsTest(_base.MappedTest):
                    "UPDATE dt SET col2='ins', col4='ins' "
                    "WHERE dt.id IN (SELECT id FROM inserted);",
                    on='mssql'),
-            ):
-            if testing.against(ins.on):
-                break
-        else:
-            ins = sa.DDL("CREATE TRIGGER dt_ins BEFORE INSERT ON dt "
+            sa.DDL("CREATE TRIGGER dt_ins BEFORE INSERT "
+                     "ON dt "
+                     "FOR EACH ROW "
+                     "BEGIN "
+                     ":NEW.col2 := 'ins'; :NEW.col4 := 'ins'; END;",
+                     on='oracle'),
+            sa.DDL("CREATE TRIGGER dt_ins BEFORE INSERT ON dt "
                          "FOR EACH ROW BEGIN "
-                         "SET NEW.col2='ins'; SET NEW.col4='ins'; END")
-        ins.execute_at('after-create', dt)
+                         "SET NEW.col2='ins'; SET NEW.col4='ins'; END",
+                         on=lambda event, schema_item, bind, **kw: 
+                                bind.engine.name not in ('oracle', 'mssql', 'sqlite')
+                ),
+            ):
+            ins.execute_at('after-create', dt)
+            
         sa.DDL("DROP TRIGGER dt_ins").execute_at('before-drop', dt)
 
-
         for up in (
             sa.DDL("CREATE TRIGGER dt_up AFTER UPDATE ON dt "
                    "FOR EACH ROW BEGIN "
@@ -54,14 +60,19 @@ class TriggerDefaultsTest(_base.MappedTest):
                    "UPDATE dt SET col3='up', col4='up' "
                    "WHERE dt.id IN (SELECT id FROM deleted);",
                    on='mssql'),
-            ):
-            if testing.against(up.on):
-                break
-        else:
-            up = sa.DDL("CREATE TRIGGER dt_up BEFORE UPDATE ON dt "
+            sa.DDL("CREATE TRIGGER dt_up BEFORE UPDATE ON dt "
+                  "FOR EACH ROW BEGIN "
+                  ":NEW.col3 := 'up'; :NEW.col4 := 'up'; END;",
+                  on='oracle'),
+            sa.DDL("CREATE TRIGGER dt_up BEFORE UPDATE ON dt "
                         "FOR EACH ROW BEGIN "
-                        "SET NEW.col3='up'; SET NEW.col4='up'; END")
-        up.execute_at('after-create', dt)
+                        "SET NEW.col3='up'; SET NEW.col4='up'; END",
+                        on=lambda event, schema_item, bind, **kw: 
+                                bind.engine.name not in ('oracle', 'mssql', 'sqlite')
+                    ),
+            ):
+            up.execute_at('after-create', dt)
+
         sa.DDL("DROP TRIGGER dt_up").execute_at('before-drop', dt)
 
 
index 3eabe2db72474d58800366f9d05c300adcea1621..425c08c61006dbbbe003875e7c254312ba898964 100644 (file)
@@ -5,8 +5,7 @@ import sqlalchemy as sa
 from sqlalchemy.test import testing
 from sqlalchemy.orm import eagerload, deferred, undefer
 from sqlalchemy import Integer, String, Date, ForeignKey, and_, select, func
-from sqlalchemy.test.schema import Table
-from sqlalchemy.test.schema import Column
+from sqlalchemy.test.schema import Table, Column
 from sqlalchemy.orm import mapper, relation, create_session, lazyload, aliased
 from sqlalchemy.test.testing import eq_
 from sqlalchemy.test.assertsql import CompiledSQL
@@ -459,20 +458,14 @@ class EagerTest(_fixtures.FixtureTest):
         })
         mapper(User, users, properties={
             'addresses':relation(mapper(Address, addresses), lazy=False, order_by=addresses.c.id),
-            'orders':relation(Order, lazy=True)
+            'orders':relation(Order, lazy=True, order_by=orders.c.id)
         })
 
         sess = create_session()
         q = sess.query(User)
 
-        if testing.against('mysql'):
-            l = q.limit(2).all()
-            assert self.static.user_all_result[:2] == l
-        else:
-            l = q.order_by(User.id).limit(2).offset(1).all()
-            print self.static.user_all_result[1:3]
-            print l
-            assert self.static.user_all_result[1:3] == l
+        l = q.order_by(User.id).limit(2).offset(1).all()
+        eq_(self.static.user_all_result[1:3], l)
 
     @testing.resolve_artifact_names
     def test_distinct(self):
@@ -483,15 +476,15 @@ class EagerTest(_fixtures.FixtureTest):
         s = sa.union_all(u2.select(use_labels=True), u2.select(use_labels=True), u2.select(use_labels=True)).alias('u')
 
         mapper(User, users, properties={
-            'addresses':relation(mapper(Address, addresses), lazy=False),
+            'addresses':relation(mapper(Address, addresses), lazy=False, order_by=addresses.c.id),
         })
 
         sess = create_session()
         q = sess.query(User)
 
         def go():
-            l = q.filter(s.c.u2_id==User.id).distinct().all()
-            assert self.static.user_address_result == l
+            l = q.filter(s.c.u2_id==User.id).distinct().order_by(User.id).all()
+            eq_(self.static.user_address_result, l)
         self.assert_sql_count(testing.db, go, 1)
 
     @testing.fails_on('maxdb', 'FIXME: unknown')
@@ -656,8 +649,10 @@ class EagerTest(_fixtures.FixtureTest):
 
         mapper(Order, orders)
         mapper(User, users, properties={
-               'orders':relation(Order, backref='user', lazy=False),
-               'max_order':relation(mapper(Order, max_orders, non_primary=True), lazy=False, uselist=False)
+               'orders':relation(Order, backref='user', lazy=False, order_by=orders.c.id),
+               'max_order':relation(
+                                mapper(Order, max_orders, non_primary=True), 
+                                lazy=False, uselist=False)
                })
 
         q = create_session().query(User)
@@ -676,7 +671,7 @@ class EagerTest(_fixtures.FixtureTest):
                     max_order=Order(id=4)
                 ),
                 User(id=10),
-            ] == q.all()
+            ] == q.order_by(User.id).all()
         self.assert_sql_count(testing.db, go, 1)
 
     @testing.resolve_artifact_names
@@ -824,15 +819,15 @@ class OrderBySecondaryTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('m2m', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('aid', Integer, ForeignKey('a.id')),
               Column('bid', Integer, ForeignKey('b.id')))
 
         Table('a', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('data', String(50)))
         Table('b', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('data', String(50)))
 
     @classmethod
@@ -874,8 +869,7 @@ class SelfReferentialEagerTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('nodes', metadata,
-              Column('id', Integer, sa.Sequence('node_id_seq', optional=True),
-                     primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('parent_id', Integer, ForeignKey('nodes.id')),
             Column('data', String(30)))
 
@@ -1089,11 +1083,11 @@ class MixedSelfReferentialEagerTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('a_table', metadata,
-                       Column('id', Integer, primary_key=True)
+                       Column('id', Integer, primary_key=True, test_needs_autoincrement=True)
                        )
 
         Table('b_table', metadata,
-                       Column('id', Integer, primary_key=True),
+                       Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
                        Column('parent_b1_id', Integer, ForeignKey('b_table.id')),
                        Column('parent_a_id', Integer, ForeignKey('a_table.id')),
                        Column('parent_b2_id', Integer, ForeignKey('b_table.id')))
@@ -1162,7 +1156,7 @@ class SelfReferentialM2MEagerTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('widget', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('name', sa.Unicode(40), nullable=False, unique=True),
         )
 
@@ -1338,13 +1332,13 @@ class CyclicalInheritingEagerTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('t1', metadata,
-            Column('c1', Integer, primary_key=True),
+            Column('c1', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('c2', String(30)),
             Column('type', String(30))
             )
 
         Table('t2', metadata,
-            Column('c1', Integer, primary_key=True),
+            Column('c1', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('c2', String(30)),
             Column('type', String(30)),
             Column('t1.id', Integer, ForeignKey('t1.c1')))
@@ -1377,12 +1371,12 @@ class SubqueryTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('users_table', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('name', String(16))
         )
 
         Table('tags_table', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('user_id', Integer, ForeignKey("users_table.id")),
             Column('score1', sa.Float),
             Column('score2', sa.Float),
@@ -1462,16 +1456,20 @@ class CorrelatedSubqueryTest(_base.MappedTest):
     Exercises a variety of ways to configure this.
     
     """
+
+    # another argument for eagerload learning about inner joins
+    
+    __requires__ = ('correlated_outer_joins', )
     
     @classmethod
     def define_tables(cls, metadata):
         users = Table('users', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('name', String(50))
             )
 
         stuff = Table('stuff', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('date', Date),
             Column('user_id', Integer, ForeignKey('users.id')))
     
@@ -1550,11 +1548,13 @@ class CorrelatedSubqueryTest(_base.MappedTest):
 
         if ondate:
             # the more 'relational' way to do this, join on the max date
-            stuff_view = select([func.max(salias.c.date).label('max_date')]).where(salias.c.user_id==users.c.id).correlate(users)
+            stuff_view = select([func.max(salias.c.date).label('max_date')]).\
+                                where(salias.c.user_id==users.c.id).correlate(users)
         else:
             # a common method with the MySQL crowd, which actually might perform better in some
             # cases - subquery does a limit with order by DESC, join on the id
-            stuff_view = select([salias.c.id]).where(salias.c.user_id==users.c.id).correlate(users).order_by(salias.c.date.desc()).limit(1)
+            stuff_view = select([salias.c.id]).where(salias.c.user_id==users.c.id).\
+                                    correlate(users).order_by(salias.c.date.desc()).limit(1)
 
         if labeled == 'label':
             stuff_view = stuff_view.label('foo')
index 819f29911ebf154dc09b983a6fdae7d0807686cb..8c196cfcfbf3d257a0058554ddd1991212db6018 100644 (file)
@@ -163,9 +163,8 @@ class LazyTest(_fixtures.FixtureTest):
         # use a union all to get a lot of rows to join against
         u2 = users.alias('u2')
         s = sa.union_all(u2.select(use_labels=True), u2.select(use_labels=True), u2.select(use_labels=True)).alias('u')
-        print [key for key in s.c.keys()]
-        l = q.filter(s.c.u2_id==User.id).distinct().all()
-        assert self.static.user_all_result == l
+        l = q.filter(s.c.u2_id==User.id).order_by(User.id).distinct().all()
+        eq_(self.static.user_all_result, l)
 
     @testing.resolve_artifact_names
     def test_one_to_many_scalar(self):
index 9b801b56d20d44982a96fd385d2dff51966e088f..55a0dcd5a4a9e48e92e5abf1174b52d8e0bd9c21 100644 (file)
@@ -4,8 +4,7 @@ from sqlalchemy.test.testing import assert_raises, assert_raises_message
 import sqlalchemy as sa
 from sqlalchemy.test import testing, pickleable
 from sqlalchemy import MetaData, Integer, String, ForeignKey, func, util
-from sqlalchemy.test.schema import Table
-from sqlalchemy.test.schema import Column
+from sqlalchemy.test.schema import Table, Column
 from sqlalchemy.engine import default
 from sqlalchemy.orm import mapper, relation, backref, create_session, class_mapper, compile_mappers, reconstructor, validates, aliased
 from sqlalchemy.orm import defer, deferred, synonym, attributes, column_property, composite, relation, dynamic_loader, comparable_property
@@ -389,7 +388,7 @@ class MapperTest(_fixtures.FixtureTest):
     @testing.resolve_artifact_names
     def test_self_ref_synonym(self):
         t = Table('nodes', MetaData(),
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('parent_id', Integer, ForeignKey('nodes.id')))
 
         class Node(object):
@@ -431,7 +430,7 @@ class MapperTest(_fixtures.FixtureTest):
     @testing.resolve_artifact_names
     def test_prop_filters(self):
         t = Table('person', MetaData(),
-                  Column('id', Integer, primary_key=True),
+                  Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
                   Column('type', String(128)),
                   Column('name', String(128)),
                   Column('employee_number', Integer),
@@ -1638,11 +1637,11 @@ class DeferredPopulationTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table("thing", metadata,
-            Column("id", Integer, primary_key=True),
+            Column("id", Integer, primary_key=True, test_needs_autoincrement=True),
             Column("name", String(20)))
 
         Table("human", metadata,
-            Column("id", Integer, primary_key=True),
+            Column("id", Integer, primary_key=True, test_needs_autoincrement=True),
             Column("thing_id", Integer, ForeignKey("thing.id")),
             Column("name", String(20)))
 
@@ -1726,13 +1725,12 @@ class CompositeTypesTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('graphs', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('version_id', Integer, primary_key=True, nullable=True),
             Column('name', String(30)))
 
         Table('edges', metadata,
-            Column('id', Integer, primary_key=True,
-                   test_needs_autoincrement=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('graph_id', Integer, nullable=False),
             Column('graph_version_id', Integer, nullable=False),
             Column('x1', Integer),
@@ -1744,7 +1742,7 @@ class CompositeTypesTest(_base.MappedTest):
             ['graphs.id', 'graphs.version_id']))
 
         Table('foobars', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('x1', Integer, default=2),
             Column('x2', Integer),
             Column('x3', Integer, default=15),
@@ -2259,31 +2257,23 @@ class RequirementsTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('ht1', metadata,
-              Column('id', Integer, primary_key=True,
-                     test_needs_autoincrement=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('value', String(10)))
         Table('ht2', metadata,
-              Column('id', Integer, primary_key=True,
-                     test_needs_autoincrement=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('ht1_id', Integer, ForeignKey('ht1.id')),
               Column('value', String(10)))
         Table('ht3', metadata,
-              Column('id', Integer, primary_key=True,
-                     test_needs_autoincrement=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('value', String(10)))
         Table('ht4', metadata,
-              Column('ht1_id', Integer, ForeignKey('ht1.id'),
-                     primary_key=True),
-              Column('ht3_id', Integer, ForeignKey('ht3.id'),
-                     primary_key=True))
+              Column('ht1_id', Integer, ForeignKey('ht1.id'), primary_key=True),
+              Column('ht3_id', Integer, ForeignKey('ht3.id'), primary_key=True))
         Table('ht5', metadata,
-              Column('ht1_id', Integer, ForeignKey('ht1.id'),
-                     primary_key=True))
+              Column('ht1_id', Integer, ForeignKey('ht1.id'), primary_key=True))
         Table('ht6', metadata,
-              Column('ht1a_id', Integer, ForeignKey('ht1.id'),
-                     primary_key=True),
-              Column('ht1b_id', Integer, ForeignKey('ht1.id'),
-                     primary_key=True),
+              Column('ht1a_id', Integer, ForeignKey('ht1.id'), primary_key=True),
+              Column('ht1b_id', Integer, ForeignKey('ht1.id'), primary_key=True),
               Column('value', String(10)))
 
     # Py2K
@@ -2404,12 +2394,12 @@ class MagicNamesTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('cartographers', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('name', String(50)),
               Column('alias', String(50)),
               Column('quip', String(100)))
         Table('maps', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('cart_id', Integer,
                      ForeignKey('cartographers.id')),
               Column('state', String(2)),
@@ -2451,7 +2441,7 @@ class MagicNamesTest(_base.MappedTest):
         for reserved in (sa.orm.attributes.ClassManager.STATE_ATTR,
                          sa.orm.attributes.ClassManager.MANAGER_ATTR):
             t = Table('t', sa.MetaData(),
-                      Column('id', Integer, primary_key=True),
+                      Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
                       Column(reserved, Integer))
             class T(object):
                 pass
index f4e3872b06a83d2a6f3144640487998de17b2b8e..29de21241f3bfb3e4034077f8b4ddf53d59ac1cb 100644 (file)
@@ -1,13 +1,13 @@
 from sqlalchemy.test.testing import assert_raises, assert_raises_message
 import sqlalchemy as sa
-from sqlalchemy import Table, Column, Integer, PickleType
+from sqlalchemy import Integer, PickleType
 import operator
 from sqlalchemy.test import testing
 from sqlalchemy.util import OrderedSet
 from sqlalchemy.orm import mapper, relation, create_session, PropComparator, synonym, comparable_property, sessionmaker
 from sqlalchemy.test.testing import eq_, ne_
 from test.orm import _base, _fixtures
-
+from sqlalchemy.test.schema import Table, Column
 
 class MergeTest(_fixtures.FixtureTest):
     """Session.merge() functionality"""
@@ -103,6 +103,7 @@ class MergeTest(_fixtures.FixtureTest):
             'addresses':relation(Address,
                         backref='user',
                         collection_class=OrderedSet,
+                                order_by=addresses.c.id,
                                  cascade="all, delete-orphan")
         })
         mapper(Address, addresses)
@@ -154,6 +155,7 @@ class MergeTest(_fixtures.FixtureTest):
         mapper(User, users, properties={
             'addresses':relation(Address,
                                  backref='user',
+                                 order_by=addresses.c.id,
                                  collection_class=OrderedSet)})
         mapper(Address, addresses)
         on_load = self.on_load_tracker(User)
@@ -737,7 +739,7 @@ class MutableMergeTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table("data", metadata, 
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', PickleType(comparator=operator.eq))
         )
     
index 1376c402e755f1c993ae8981fe6120b125609bf7..b02afb2a553a14fbeac46701e863973aaeb8eb6b 100644 (file)
@@ -6,8 +6,7 @@ from sqlalchemy.test.testing import eq_, assert_raises, assert_raises_message
 import sqlalchemy as sa
 from sqlalchemy.test import testing
 from sqlalchemy import Integer, String, ForeignKey
-from sqlalchemy.test.schema import Table
-from sqlalchemy.test.schema import Column
+from sqlalchemy.test.schema import Table, Column
 from sqlalchemy.orm import mapper, relation, create_session
 from sqlalchemy.test.testing import eq_
 from test.orm import _base
@@ -16,6 +15,11 @@ class NaturalPKTest(_base.MappedTest):
 
     @classmethod
     def define_tables(cls, metadata):
+        if testing.against('oracle'):
+            fk_args = dict(deferrable=True, initially='deferred')
+        else:
+            fk_args = dict(onupdate='cascade')
+            
         users = Table('users', metadata,
             Column('username', String(50), primary_key=True),
             Column('fullname', String(100)),
@@ -23,7 +27,7 @@ class NaturalPKTest(_base.MappedTest):
 
         addresses = Table('addresses', metadata,
             Column('email', String(50), primary_key=True),
-            Column('username', String(50), ForeignKey('users.username', onupdate="cascade")),
+            Column('username', String(50), ForeignKey('users.username', **fk_args)),
             test_needs_fk=True)
 
         items = Table('items', metadata,
@@ -32,8 +36,8 @@ class NaturalPKTest(_base.MappedTest):
             test_needs_fk=True)
 
         users_to_items = Table('users_to_items', metadata,
-            Column('username', String(50), ForeignKey('users.username', onupdate='cascade'), primary_key=True),
-            Column('itemname', String(50), ForeignKey('items.itemname', onupdate='cascade'), primary_key=True),
+            Column('username', String(50), ForeignKey('users.username', **fk_args), primary_key=True),
+            Column('itemname', String(50), ForeignKey('items.itemname', **fk_args), primary_key=True),
             test_needs_fk=True)
 
     @classmethod
@@ -110,6 +114,7 @@ class NaturalPKTest(_base.MappedTest):
         
 
     @testing.fails_on('sqlite', 'sqlite doesnt support ON UPDATE CASCADE')
+    @testing.fails_on('oracle', 'oracle doesnt support ON UPDATE CASCADE')
     def test_onetomany_passive(self):
         self._test_onetomany(True)
 
@@ -161,6 +166,7 @@ class NaturalPKTest(_base.MappedTest):
         
 
     @testing.fails_on('sqlite', 'sqlite doesnt support ON UPDATE CASCADE')
+    @testing.fails_on('oracle', 'oracle doesnt support ON UPDATE CASCADE')
     def test_manytoone_passive(self):
         self._test_manytoone(True)
 
@@ -203,6 +209,7 @@ class NaturalPKTest(_base.MappedTest):
         eq_([Address(username='ed'), Address(username='ed')], sess.query(Address).all())
 
     @testing.fails_on('sqlite', 'sqlite doesnt support ON UPDATE CASCADE')
+    @testing.fails_on('oracle', 'oracle doesnt support ON UPDATE CASCADE')
     def test_onetoone_passive(self):
         self._test_onetoone(True)
 
@@ -244,6 +251,7 @@ class NaturalPKTest(_base.MappedTest):
         eq_([Address(username='ed')], sess.query(Address).all())
         
     @testing.fails_on('sqlite', 'sqlite doesnt support ON UPDATE CASCADE')
+    @testing.fails_on('oracle', 'oracle doesnt support ON UPDATE CASCADE')
     def test_bidirectional_passive(self):
         self._test_bidirectional(True)
 
@@ -298,6 +306,7 @@ class NaturalPKTest(_base.MappedTest):
 
 
     @testing.fails_on('sqlite', 'sqlite doesnt support ON UPDATE CASCADE')
+    @testing.fails_on('oracle', 'oracle doesnt support ON UPDATE CASCADE')
     def test_manytomany_passive(self):
         self._test_manytomany(True)
 
@@ -361,10 +370,15 @@ class SelfRefTest(_base.MappedTest):
 
     @classmethod
     def define_tables(cls, metadata):
+        if testing.against('oracle'):
+            fk_args = dict(deferrable=True, initially='deferred')
+        else:
+            fk_args = dict(onupdate='cascade')
+        
         Table('nodes', metadata,
               Column('name', String(50), primary_key=True),
               Column('parent', String(50),
-                     ForeignKey('nodes.name', onupdate='cascade')))
+                     ForeignKey('nodes.name', **fk_args)))
 
     @classmethod
     def setup_classes(cls):
@@ -400,17 +414,22 @@ class SelfRefTest(_base.MappedTest):
 class NonPKCascadeTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
+        if testing.against('oracle'):
+            fk_args = dict(deferrable=True, initially='deferred')
+        else:
+            fk_args = dict(onupdate='cascade')
+
         Table('users', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('username', String(50), unique=True),
             Column('fullname', String(100)),
             test_needs_fk=True)
 
         Table('addresses', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('email', String(50)),
               Column('username', String(50),
-                     ForeignKey('users.username', onupdate="cascade")),
+                     ForeignKey('users.username', **fk_args)),
                      test_needs_fk=True
                      )
 
@@ -422,6 +441,7 @@ class NonPKCascadeTest(_base.MappedTest):
             pass
 
     @testing.fails_on('sqlite', 'sqlite doesnt support ON UPDATE CASCADE')
+    @testing.fails_on('oracle', 'oracle doesnt support ON UPDATE CASCADE')
     def test_onetomany_passive(self):
         self._test_onetomany(True)
 
index 5343cc15b940a201a1677c5b2624a1a83d301e67..93e188055fe71893dc9a4e47e96586c11f8df17f 100644 (file)
@@ -3,8 +3,7 @@ import pickle
 import sqlalchemy as sa
 from sqlalchemy.test import testing
 from sqlalchemy import Integer, String, ForeignKey
-from sqlalchemy.test.schema import Table
-from sqlalchemy.test.schema import Column
+from sqlalchemy.test.schema import Table, Column
 from sqlalchemy.orm import mapper, relation, create_session, attributes
 from test.orm import _base, _fixtures
 
@@ -136,7 +135,7 @@ class PolymorphicDeferredTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('users', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('name', String(30)),
             Column('type', String(30)))
         Table('email_users', metadata,
index bb15641525e5c27ce615b6f85303ae8d260abe3d..f223c54ee08b0b752cb659f2a488c175a049a757 100644 (file)
@@ -984,8 +984,14 @@ class CountTest(QueryTest):
         
 class DistinctTest(QueryTest):
     def test_basic(self):
-        assert [User(id=7), User(id=8), User(id=9),User(id=10)] == create_session().query(User).distinct().all()
-        assert [User(id=7), User(id=9), User(id=8),User(id=10)] == create_session().query(User).distinct().order_by(desc(User.name)).all()
+        eq_(
+            [User(id=7), User(id=8), User(id=9),User(id=10)],
+            create_session().query(User).order_by(User.id).distinct().all()
+        )
+        eq_(
+            [User(id=7), User(id=9), User(id=8),User(id=10)], 
+            create_session().query(User).distinct().order_by(desc(User.name)).all()
+        ) 
 
     def test_joined(self):
         """test that orderbys from a joined table get placed into the columns clause when DISTINCT is used"""
index fef1577f0757c5e3e334d1b84732e329b315eae9..dac2db6e1d5d03a60c16d55be07c133e477a3e76 100644 (file)
@@ -3,8 +3,7 @@ import datetime
 import sqlalchemy as sa
 from sqlalchemy.test import testing
 from sqlalchemy import Integer, String, ForeignKey, MetaData, and_
-from sqlalchemy.test.schema import Table
-from sqlalchemy.test.schema import Column
+from sqlalchemy.test.schema import Table, Column
 from sqlalchemy.orm import mapper, relation, backref, create_session, compile_mappers, clear_mappers, sessionmaker
 from sqlalchemy.test.testing import eq_, startswith_
 from test.orm import _base, _fixtures
@@ -32,17 +31,17 @@ class RelationTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table("tbl_a", metadata,
-            Column("id", Integer, primary_key=True),
+            Column("id", Integer, primary_key=True, test_needs_autoincrement=True),
             Column("name", String(128)))
         Table("tbl_b", metadata,
-            Column("id", Integer, primary_key=True),
+            Column("id", Integer, primary_key=True, test_needs_autoincrement=True),
             Column("name", String(128)))
         Table("tbl_c", metadata,
-            Column("id", Integer, primary_key=True),
+            Column("id", Integer, primary_key=True, test_needs_autoincrement=True),
             Column("tbl_a_id", Integer, ForeignKey("tbl_a.id"), nullable=False),
             Column("name", String(128)))
         Table("tbl_d", metadata,
-            Column("id", Integer, primary_key=True),
+            Column("id", Integer, primary_key=True, test_needs_autoincrement=True),
             Column("tbl_c_id", Integer, ForeignKey("tbl_c.id"), nullable=False),
             Column("tbl_b_id", Integer, ForeignKey("tbl_b.id")),
             Column("name", String(128)))
@@ -132,7 +131,7 @@ class RelationTest2(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('company_t', metadata,
-              Column('company_id', Integer, primary_key=True),
+              Column('company_id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('name', sa.Unicode(30)))
 
         Table('employee_t', metadata,
@@ -395,7 +394,7 @@ class RelationTest4(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table("tableA", metadata,
-              Column("id",Integer,primary_key=True),
+              Column("id",Integer,primary_key=True, test_needs_autoincrement=True),
               Column("foo",Integer,),
               test_needs_fk=True)
         Table("tableB",metadata,
@@ -642,12 +641,12 @@ class RelationTest6(_base.MappedTest):
     
     @classmethod
     def define_tables(cls, metadata):
-        Table('tags', metadata, Column("id", Integer, primary_key=True),
+        Table('tags', metadata, Column("id", Integer, primary_key=True, test_needs_autoincrement=True),
             Column("data", String(50)),
         )
 
         Table('tag_foo', metadata, 
-            Column("id", Integer, primary_key=True),
+            Column("id", Integer, primary_key=True, test_needs_autoincrement=True),
             Column('tagid', Integer),
             Column("data", String(50)),
         )
@@ -691,11 +690,11 @@ class BackrefPropagatesForwardsArgs(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('users', metadata, 
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('name', String(50))
         )
         Table('addresses', metadata, 
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('user_id', Integer),
             Column('email', String(50))
         )
@@ -738,7 +737,7 @@ class AmbiguousJoinInterpretedAsSelfRef(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         subscriber_table = Table('subscriber', metadata,
-           Column('id', Integer, primary_key=True),
+           Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
            Column('dummy', String(10)) # to appease older sqlite version
           )
 
@@ -947,18 +946,18 @@ class TypeMatchTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table("a", metadata,
-              Column('aid', Integer, primary_key=True),
+              Column('aid', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('data', String(30)))
         Table("b", metadata,
-               Column('bid', Integer, primary_key=True),
+               Column('bid', Integer, primary_key=True, test_needs_autoincrement=True),
                Column("a_id", Integer, ForeignKey("a.aid")),
                Column('data', String(30)))
         Table("c", metadata,
-              Column('cid', Integer, primary_key=True),
+              Column('cid', Integer, primary_key=True, test_needs_autoincrement=True),
               Column("b_id", Integer, ForeignKey("b.bid")),
               Column('data', String(30)))
         Table("d", metadata,
-              Column('did', Integer, primary_key=True),
+              Column('did', Integer, primary_key=True, test_needs_autoincrement=True),
               Column("a_id", Integer, ForeignKey("a.aid")),
               Column('data', String(30)))
 
@@ -1116,14 +1115,14 @@ class ViewOnlyOverlappingNames(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table("t1", metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(40)))
         Table("t2", metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(40)),
             Column('t1id', Integer, ForeignKey('t1.id')))
         Table("t3", metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(40)),
             Column('t2id', Integer, ForeignKey('t2.id')))
 
@@ -1176,14 +1175,14 @@ class ViewOnlyUniqueNames(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table("t1", metadata,
-            Column('t1id', Integer, primary_key=True),
+            Column('t1id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(40)))
         Table("t2", metadata,
-            Column('t2id', Integer, primary_key=True),
+            Column('t2id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(40)),
             Column('t1id_ref', Integer, ForeignKey('t1.t1id')))
         Table("t3", metadata,
-            Column('t3id', Integer, primary_key=True),
+            Column('t3id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(40)),
             Column('t2id_ref', Integer, ForeignKey('t2.t2id')))
 
@@ -1309,12 +1308,12 @@ class ViewOnlyRepeatedRemoteColumn(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('foos', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('bid1', Integer,ForeignKey('bars.id')),
               Column('bid2', Integer,ForeignKey('bars.id')))
 
         Table('bars', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('data', String(50)))
 
     @testing.resolve_artifact_names
@@ -1357,10 +1356,10 @@ class ViewOnlyRepeatedLocalColumn(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('foos', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('data', String(50)))
 
-        Table('bars', metadata, Column('id', Integer, primary_key=True),
+        Table('bars', metadata, Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('fid1', Integer, ForeignKey('foos.id')),
               Column('fid2', Integer, ForeignKey('foos.id')),
               Column('data', String(50)))
@@ -1405,14 +1404,14 @@ class ViewOnlyComplexJoin(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('t1', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(50)))
         Table('t2', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(50)),
             Column('t1id', Integer, ForeignKey('t1.id')))
         Table('t3', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(50)))
         Table('t2tot3', metadata,
             Column('t2id', Integer, ForeignKey('t2.id')),
@@ -1476,10 +1475,10 @@ class ExplicitLocalRemoteTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('t1', metadata,
-            Column('id', String(50), primary_key=True),
+            Column('id', String(50), primary_key=True, test_needs_autoincrement=True),
             Column('data', String(50)))
         Table('t2', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(50)),
             Column('t1id', String(50)))
 
index 9f2f59e19b42db526f5d5920b489b73159b02fb1..0d6b3deaecbbdc5fee2f83771e6aa0c4070ac013 100644 (file)
@@ -3,13 +3,13 @@ import sqlalchemy as sa
 from sqlalchemy.test import testing
 from sqlalchemy.orm import scoped_session
 from sqlalchemy import Integer, String, ForeignKey
-from sqlalchemy.test.schema import Table
-from sqlalchemy.test.schema import Column
+from sqlalchemy.test.schema import Table, Column
 from sqlalchemy.orm import mapper, relation, query
 from sqlalchemy.test.testing import eq_
 from test.orm import _base
 
 
+
 class _ScopedTest(_base.MappedTest):
     """Adds another lookup bucket to emulate Session globals."""
 
@@ -34,10 +34,10 @@ class ScopedSessionTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('table1', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('data', String(30)))
         Table('table2', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('someid', None, ForeignKey('table1.id')))
 
     @testing.resolve_artifact_names
@@ -82,10 +82,10 @@ class ScopedMapperTest(_ScopedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('table1', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(30)))
         Table('table2', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('someid', None, ForeignKey('table1.id')))
 
     @classmethod
@@ -204,11 +204,11 @@ class ScopedMapperTest2(_ScopedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('table1', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(30)),
             Column('type', String(30)))
         Table('table2', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('someid', None, ForeignKey('table1.id')),
             Column('somedata', String(30)))
 
index 0a20253607772a0b9348ac693e6b0b1696e122b6..bfa40089573e0f0418a0abc34f990f7140b167f4 100644 (file)
@@ -3,8 +3,7 @@ from sqlalchemy.test.testing import assert_raises, assert_raises_message
 import sqlalchemy as sa
 from sqlalchemy.test import testing
 from sqlalchemy import String, Integer, select
-from sqlalchemy.test.schema import Table
-from sqlalchemy.test.schema import Column
+from sqlalchemy.test.schema import Table, Column
 from sqlalchemy.orm import mapper, create_session
 from sqlalchemy.test.testing import eq_
 from test.orm import _base
@@ -16,7 +15,7 @@ class SelectableNoFromsTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('common', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('data', Integer),
               Column('extra', String(45)))
 
index 4988adf57f1fd13bdfc40a256570bd95e9832776..5a8e7a555202b7ce9bee0aba71c020ce52f621c2 100644 (file)
@@ -6,8 +6,7 @@ from sqlalchemy.orm import create_session, sessionmaker, attributes
 import sqlalchemy as sa
 from sqlalchemy.test import engines, testing, config
 from sqlalchemy import Integer, String, Sequence
-from sqlalchemy.test.schema import Table
-from sqlalchemy.test.schema import Column
+from sqlalchemy.test.schema import Table, Column
 from sqlalchemy.orm import mapper, relation, backref, eagerload
 from sqlalchemy.test.testing import eq_
 from test.engine import _base as engine_base
@@ -381,18 +380,18 @@ class SessionTest(_fixtures.FixtureTest):
         session = create_session(bind=testing.db)
 
         session.begin()
-        session.connection().execute("insert into users (name) values ('user1')")
+        session.connection().execute(users.insert().values(name='user1'))
 
         session.begin(subtransactions=True)
 
         session.begin_nested()
 
-        session.connection().execute("insert into users (name) values ('user2')")
+        session.connection().execute(users.insert().values(name='user2'))
         assert session.connection().execute("select count(1) from users").scalar() == 2
 
         session.rollback()
         assert session.connection().execute("select count(1) from users").scalar() == 1
-        session.connection().execute("insert into users (name) values ('user3')")
+        session.connection().execute(users.insert().values(name='user3'))
 
         session.commit()
         assert session.connection().execute("select count(1) from users").scalar() == 2
@@ -1186,7 +1185,7 @@ class DisposedStates(_base.MappedTest):
     def define_tables(cls, metadata):
         global t1
         t1 = Table('t1', metadata, 
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(50))
             )
 
@@ -1285,7 +1284,7 @@ class SessionInterface(testing.TestBase):
 
     def _map_it(self, cls):
         return mapper(cls, Table('t', sa.MetaData(),
-                                 Column('id', Integer, primary_key=True)))
+                                 Column('id', Integer, primary_key=True, test_needs_autoincrement=True)))
 
     @testing.uses_deprecated()
     def _test_instance_guards(self, user_arg):
@@ -1405,7 +1404,7 @@ class TLTransactionTest(engine_base.AltEngineTest, _base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('users', metadata,
-              Column('id', Integer, primary_key=True),
+              Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('name', String(20)),
               test_needs_acid=True)
 
index a1b1d4376b9beeeae21ebd31946b7c81c8cca0bf..84d20ed92c5a6a98a05145b82e6b54550a80ae16 100644 (file)
@@ -884,7 +884,7 @@ class DefaultTest(_base.MappedTest):
             Column('foober', String(30), default="im foober", onupdate="im the update"))
 
         st = Table('secondary_table', metadata,
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('data', String(50)))
 
         if testing.against('postgres', 'oracle'):
@@ -1037,7 +1037,7 @@ class ColumnPropertyTest(_base.MappedTest):
     @classmethod
     def define_tables(cls, metadata):
         Table('data', metadata, 
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
             Column('a', String(50)),
             Column('b', String(50))
             )
@@ -2170,8 +2170,14 @@ class RowSwitchTest(_base.MappedTest):
         sess.add(o5)
         sess.flush()
 
-        assert list(sess.execute(t5.select(), mapper=T5)) == [(1, 'some t5')]
-        assert list(sess.execute(t6.select(), mapper=T5)) == [(1, 'some t6', 1), (2, 'some other t6', 1)]
+        eq_(
+            list(sess.execute(t5.select(), mapper=T5)),
+            [(1, 'some t5')]
+        )
+        eq_(
+            list(sess.execute(t6.select().order_by(t6.c.id), mapper=T5)),
+            [(1, 'some t6', 1), (2, 'some other t6', 1)]
+        )
 
         o6 = T5(data='some other t5', id=o5.id, t6s=[
             T6(data='third t6', id=3),
@@ -2181,8 +2187,14 @@ class RowSwitchTest(_base.MappedTest):
         sess.add(o6)
         sess.flush()
 
-        assert list(sess.execute(t5.select(), mapper=T5)) == [(1, 'some other t5')]
-        assert list(sess.execute(t6.select(), mapper=T5)) == [(3, 'third t6', 1), (4, 'fourth t6', 1)]
+        eq_(
+            list(sess.execute(t5.select(), mapper=T5)),
+            [(1, 'some other t5')]
+        )
+        eq_(
+            list(sess.execute(t6.select().order_by(t6.c.id), mapper=T5)),
+            [(3, 'third t6', 1), (4, 'fourth t6', 1)]
+        )
 
     @testing.resolve_artifact_names
     def test_manytomany(self):