From: Mike Bayer Date: Thu, 7 Jan 2010 00:07:19 +0000 (+0000) Subject: - Default generators like Sequence() translate correctly X-Git-Tag: rel_0_5_8~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=da4155b3fa714c58035a74767c2634546caed80d;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Default generators like Sequence() translate correctly across a copy() operation. - Sequence() and other DefaultGenerator objects are accepted as the value for the "default" and "onupdate" keyword arguments of Column, in addition to being accepted positionally. --- diff --git a/CHANGES b/CHANGES index b25239af85..1071f01326 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,14 @@ CHANGES declarative helpers which place common columns on multiple subclasses. + - Default generators like Sequence() translate correctly + across a copy() operation. + + - Sequence() and other DefaultGenerator objects are accepted + as the value for the "default" and "onupdate" keyword + arguments of Column, in addition to being accepted + positionally. + - Fixed a column arithmetic bug that affected column correspondence for cloned selectables which contain free-standing column expressions. This bug is diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index ce095799b0..7ea852a05a 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -697,7 +697,7 @@ class Column(SchemaItem, expression.ColumnClause): toinit = list(self.args) if self.default is not None: - if isinstance(self.default, ColumnDefault): + if isinstance(self.default, DefaultGenerator): toinit.append(self.default) else: toinit.append(ColumnDefault(self.default)) @@ -707,7 +707,10 @@ class Column(SchemaItem, expression.ColumnClause): else: toinit.append(DefaultClause(self.server_default)) if self.onupdate is not None: - toinit.append(ColumnDefault(self.onupdate, for_update=True)) + if isinstance(self.onupdate, DefaultGenerator): + toinit.append(self.onupdate) + else: + toinit.append(ColumnDefault(self.onupdate, for_update=True)) if self.server_onupdate is not None: if isinstance(self.server_onupdate, FetchedValue): toinit.append(self.server_default) diff --git a/test/engine/test_metadata.py b/test/engine/test_metadata.py index 6f1a45e5da..5ee6e7d386 100644 --- a/test/engine/test_metadata.py +++ b/test/engine/test_metadata.py @@ -1,7 +1,8 @@ from sqlalchemy.test.testing import assert_raises, assert_raises_message import pickle from sqlalchemy import MetaData -from sqlalchemy import Integer, String, UniqueConstraint, CheckConstraint, ForeignKey, Sequence +from sqlalchemy import Integer, String, UniqueConstraint, CheckConstraint, ForeignKey, \ + Sequence, ColumnDefault from sqlalchemy.test.schema import Table from sqlalchemy.test.schema import Column import sqlalchemy as tsa @@ -61,7 +62,7 @@ class MetaDataTest(TestBase, ComparesTables): meta = MetaData() table = Table('mytable', meta, - Column('myid', Integer, primary_key=True), + Column('myid', Integer, Sequence('foo_id_seq'), primary_key=True), Column('name', String(40), nullable=True), Column('foo', String(40), nullable=False, server_default='x', server_onupdate='q'), Column('bar', String(40), nullable=False, default='y', onupdate='z'), @@ -114,6 +115,7 @@ class MetaDataTest(TestBase, ComparesTables): assert 'x' in str(table_c.c.foo.server_default.arg) if not reflect: + assert isinstance(table_c.c.myid.default, Sequence) assert str(table_c.c.foo.server_onupdate.arg) == 'q' assert str(table_c.c.bar.default.arg) == 'y' assert getattr(table_c.c.bar.onupdate.arg, 'arg', table_c.c.bar.onupdate.arg) == 'z' @@ -199,6 +201,15 @@ class TableOptionsTest(TestBase): assert t.info['bar'] == 'zip' class ColumnOptionsTest(TestBase): + + def test_default_generators(self): + g1, g2 = Sequence('foo_id_seq'), ColumnDefault('f5') + assert Column(default=g1).default is g1 + assert Column(onupdate=g1).onupdate is g1 + assert Column(default=g2).default is g2 + assert Column(onupdate=g2).onupdate is g2 + + def test_column_info(self): c1 = Column('foo', info={'x':'y'})