From 32dcfdf80801051971ce9638a1d9292262b375aa Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 22 Sep 2007 17:14:15 +0000 Subject: [PATCH] - added "schema" argument to Sequence; use this with Postgres /Oracle when the sequence is located in an alternate schema. Implements part of [ticket:584], should fix [ticket:761]. --- CHANGES | 3 +++ lib/sqlalchemy/schema.py | 3 ++- lib/sqlalchemy/sql/compiler.py | 7 +++++-- test/dialect/oracle.py | 13 +++++++++++++ test/dialect/postgres.py | 12 ++++++++++++ 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 9cc170505d..6ecb23bc13 100644 --- a/CHANGES +++ b/CHANGES @@ -28,6 +28,9 @@ CHANGES But this doesn't work for dictionaries. Pickled objects which provide an adequate __eq__() implementation can be set up with "PickleType(comparator=operator.eq)" [ticket:560] + +- added "schema" argument to Sequence; use this with Postgres /Oracle when the sequence is + located in an alternate schema. Implements part of [ticket:584], should fix [ticket:761]. - Fixed reflection of the empty string for mysql enums. diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index 3b7f08f79c..713adc5854 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -770,13 +770,14 @@ class ColumnDefault(DefaultGenerator): class Sequence(DefaultGenerator): """Represent a sequence, which applies to Oracle and Postgres databases.""" - def __init__(self, name, start = None, increment = None, optional=False, quote=False, **kwargs): + def __init__(self, name, start = None, increment = None, schema=None, optional=False, quote=False, **kwargs): super(Sequence, self).__init__(**kwargs) self.name = name self.start = start self.increment = increment self.optional=optional self.quote = quote + self.schema = schema def __repr__(self): return "Sequence(%s)" % ', '.join( diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 2b4786cb25..4fca6b2ecc 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -1000,8 +1000,11 @@ class IdentifierPreparer(object): def should_quote(self, object): return object.quote or self._requires_quotes(object.name) - def format_sequence(self, sequence): - return self.__generic_obj_format(sequence, sequence.name) + def format_sequence(self, sequence, use_schema=True): + name = self.__generic_obj_format(sequence, sequence.name) + if use_schema and sequence.schema is not None: + name = self.__generic_obj_format(sequence, sequence.schema) + "." + name + return name def format_label(self, label, name=None): return self.__generic_obj_format(label, name or label.name) diff --git a/test/dialect/oracle.py b/test/dialect/oracle.py index a717a7338f..cbad7ced89 100644 --- a/test/dialect/oracle.py +++ b/test/dialect/oracle.py @@ -119,6 +119,19 @@ myothertable.othername != :myothertable_othername OR EXISTS (select yay from foo "addresses.address_type_id, addresses.email_address FROM addresses LEFT OUTER JOIN address_types address_types_1 " "ON addresses.address_type_id = address_types_1.id WHERE addresses.user_id = :addresses_user_id ORDER BY addresses.rowid, " "address_types.rowid") + +class SequenceTest(SQLCompileTest): + def test_basic(self): + seq = Sequence("my_seq_no_schema") + dialect = oracle.OracleDialect() + assert dialect.identifier_preparer.format_sequence(seq) == "my_seq_no_schema" + + seq = Sequence("my_seq", schema="some_schema") + assert dialect.identifier_preparer.format_sequence(seq) == "some_schema.my_seq" + + seq = Sequence("My_Seq", schema="Some_Schema") + assert dialect.identifier_preparer.format_sequence(seq) == '"Some_Schema"."My_Seq"' + if __name__ == '__main__': testbase.main() diff --git a/test/dialect/postgres.py b/test/dialect/postgres.py index 06cebaf17d..bae1f666de 100644 --- a/test/dialect/postgres.py +++ b/test/dialect/postgres.py @@ -5,6 +5,18 @@ from sqlalchemy import exceptions from sqlalchemy.databases import postgres from testlib import * +class SequenceTest(SQLCompileTest): + def test_basic(self): + seq = Sequence("my_seq_no_schema") + dialect = postgres.PGDialect() + assert dialect.identifier_preparer.format_sequence(seq) == "my_seq_no_schema" + + seq = Sequence("my_seq", schema="some_schema") + assert dialect.identifier_preparer.format_sequence(seq) == "some_schema.my_seq" + + seq = Sequence("My_Seq", schema="Some_Schema") + assert dialect.identifier_preparer.format_sequence(seq) == '"Some_Schema"."My_Seq"' + class InsertTest(AssertMixin): @testing.supported('postgres') def setUpAll(self): -- 2.47.3