From c462e42dfd705ed781c9ae0505c0c65a71c8936e Mon Sep 17 00:00:00 2001 From: Jason Kirtland Date: Tue, 18 Mar 2008 00:25:55 +0000 Subject: [PATCH] - Declarative will complete setup for Columns lacking names, allows a more DRY syntax. class Foo(Base): __tablename__ = 'foos' id = Column(Integer, primary_key=True) --- CHANGES | 7 +++++++ lib/sqlalchemy/ext/declarative.py | 16 ++++++++++++---- test/ext/declarative.py | 13 +++++++++---- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 8cf8e49577..8ef5013e34 100644 --- a/CHANGES +++ b/CHANGES @@ -42,6 +42,13 @@ CHANGES @comparable_using(...), front-ends for synonym and comparable_property. + - Declarative will complete setup for Columns lacking names, + allows a more DRY syntax. + + class Foo(Base): + __tablename__ = 'foos' + id = Column(Integer, primary_key=True) + 0.4.4 ------ - sql diff --git a/lib/sqlalchemy/ext/declarative.py b/lib/sqlalchemy/ext/declarative.py index 43cdad1cc6..333b1eaa40 100644 --- a/lib/sqlalchemy/ext/declarative.py +++ b/lib/sqlalchemy/ext/declarative.py @@ -157,7 +157,7 @@ class DeclarativeMeta(type): return type.__init__(cls, classname, bases, dict_) cls._decl_class_registry[classname] = cls - our_stuff = {} + our_stuff = util.OrderedDict() for k in dict_: value = dict_[k] if (isinstance(value, tuple) and len(value) == 1 and @@ -180,9 +180,17 @@ class DeclarativeMeta(type): table_kw = {'autoload': True} else: table_kw = {} - cls.__table__ = table = Table(tablename, cls.metadata, *[ - c for c in our_stuff.values() if isinstance(c, Column) - ], **table_kw) + cols = [] + for key, c in our_stuff.iteritems(): + if not isinstance(c, Column): + continue + if c.key is None: + c.key = key + if c.name is None: + c.name = key + cols.append(c) + cls.__table__ = table = Table(tablename, cls.metadata, + *cols, **table_kw) else: table = cls.__table__ diff --git a/test/ext/declarative.py b/test/ext/declarative.py index d59f88d087..99686dbe77 100644 --- a/test/ext/declarative.py +++ b/test/ext/declarative.py @@ -28,12 +28,17 @@ class DeclarativeTest(TestBase): class Address(Base, Fixture): __tablename__ = 'addresses' - id = Column('id', Integer, primary_key=True) - email = Column('email', String(50)) - user_id = Column('user_id', Integer, ForeignKey('users.id')) + id = Column(Integer, primary_key=True) + email = Column(String(50), key='_email') + user_id = Column('user_id', Integer, ForeignKey('users.id'), + key='_user_id') Base.metadata.create_all() - + + assert Address.__table__.c['id'].name == 'id' + assert Address.__table__.c['_email'].name == 'email' + assert Address.__table__.c['_user_id'].name == 'user_id' + u1 = User(name='u1', addresses=[ Address(email='one'), Address(email='two'), -- 2.47.3