From 26040534cc2c954d87d2a3bc8f8024b25b63ca63 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 5 Jul 2009 00:18:21 +0000 Subject: [PATCH] this should be just about 100% coverage --- 06CHANGES | 5 +- lib/sqlalchemy/dialects/oracle/base.py | 35 +++++++++++++- lib/sqlalchemy/schema.py | 14 ++++-- lib/sqlalchemy/sql/compiler.py | 13 +++-- lib/sqlalchemy/test/requires.py | 12 ++++- test/orm/test_defaults.py | 41 ++++++++++------ test/orm/test_eager_relations.py | 66 +++++++++++++------------- test/orm/test_lazy_relations.py | 5 +- test/orm/test_mapper.py | 48 ++++++++----------- test/orm/test_merge.py | 8 ++-- test/orm/test_naturalpks.py | 38 +++++++++++---- test/orm/test_pickled.py | 5 +- test/orm/test_query.py | 10 +++- test/orm/test_relationships.py | 63 ++++++++++++------------ test/orm/test_scoping.py | 16 +++---- test/orm/test_selectable.py | 5 +- test/orm/test_session.py | 15 +++--- test/orm/test_unitofwork.py | 24 +++++++--- 18 files changed, 257 insertions(+), 166 deletions(-) diff --git a/06CHANGES b/06CHANGES index a726ec22aa..8b236fcbd5 100644 --- a/06CHANGES +++ b/06CHANGES @@ -87,7 +87,10 @@ - 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= will emit a warning, not + emit ON UPDATE CASCADE which is unsupported by oracle + - new dialects - pg8000 - pyodbc+mysql diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py index c8f3353129..dff0f52fac 100644 --- a/lib/sqlalchemy/dialects/oracle/base.py +++ b/lib/sqlalchemy/dialects/oracle/base.py @@ -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", {}) diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index 855bf71ffe..df39a658fd 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -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: diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 237c8722c0..cab7659c43 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -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: diff --git a/lib/sqlalchemy/test/requires.py b/lib/sqlalchemy/test/requires.py index a3e9679041..98408ace98 100644 --- a/lib/sqlalchemy/test/requires.py +++ b/lib/sqlalchemy/test/requires.py @@ -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( diff --git a/test/orm/test_defaults.py b/test/orm/test_defaults.py index 56571037e4..5379c97149 100644 --- a/test/orm/test_defaults.py +++ b/test/orm/test_defaults.py @@ -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) diff --git a/test/orm/test_eager_relations.py b/test/orm/test_eager_relations.py index 3eabe2db72..425c08c610 100644 --- a/test/orm/test_eager_relations.py +++ b/test/orm/test_eager_relations.py @@ -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') diff --git a/test/orm/test_lazy_relations.py b/test/orm/test_lazy_relations.py index 819f29911e..8c196cfcfb 100644 --- a/test/orm/test_lazy_relations.py +++ b/test/orm/test_lazy_relations.py @@ -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): diff --git a/test/orm/test_mapper.py b/test/orm/test_mapper.py index 9b801b56d2..55a0dcd5a4 100644 --- a/test/orm/test_mapper.py +++ b/test/orm/test_mapper.py @@ -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 diff --git a/test/orm/test_merge.py b/test/orm/test_merge.py index f4e3872b06..29de21241f 100644 --- a/test/orm/test_merge.py +++ b/test/orm/test_merge.py @@ -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)) ) diff --git a/test/orm/test_naturalpks.py b/test/orm/test_naturalpks.py index 1376c402e7..b02afb2a55 100644 --- a/test/orm/test_naturalpks.py +++ b/test/orm/test_naturalpks.py @@ -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) diff --git a/test/orm/test_pickled.py b/test/orm/test_pickled.py index 5343cc15b9..93e188055f 100644 --- a/test/orm/test_pickled.py +++ b/test/orm/test_pickled.py @@ -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, diff --git a/test/orm/test_query.py b/test/orm/test_query.py index bb15641525..f223c54ee0 100644 --- a/test/orm/test_query.py +++ b/test/orm/test_query.py @@ -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""" diff --git a/test/orm/test_relationships.py b/test/orm/test_relationships.py index fef1577f07..dac2db6e1d 100644 --- a/test/orm/test_relationships.py +++ b/test/orm/test_relationships.py @@ -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))) diff --git a/test/orm/test_scoping.py b/test/orm/test_scoping.py index 9f2f59e19b..0d6b3deaec 100644 --- a/test/orm/test_scoping.py +++ b/test/orm/test_scoping.py @@ -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))) diff --git a/test/orm/test_selectable.py b/test/orm/test_selectable.py index 0a20253607..bfa4008957 100644 --- a/test/orm/test_selectable.py +++ b/test/orm/test_selectable.py @@ -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))) diff --git a/test/orm/test_session.py b/test/orm/test_session.py index 4988adf57f..5a8e7a5552 100644 --- a/test/orm/test_session.py +++ b/test/orm/test_session.py @@ -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) diff --git a/test/orm/test_unitofwork.py b/test/orm/test_unitofwork.py index a1b1d4376b..84d20ed92c 100644 --- a/test/orm/test_unitofwork.py +++ b/test/orm/test_unitofwork.py @@ -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): -- 2.47.3