From: Mike Bayer Date: Tue, 4 Jan 2011 17:38:54 +0000 (-0500) Subject: - sorry, I really don't want metaclass recipes in the main documentation. Don't X-Git-Tag: rel_0_7b1~90 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8f78d5ba00f7e8656bdd7fd07dbadb5a6b4d1b72;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - sorry, I really don't want metaclass recipes in the main documentation. Don't want people using them, thinking they're needed in the general case, confused, etc. The two sections here are moved to the wiki for now. --- diff --git a/lib/sqlalchemy/ext/declarative.py b/lib/sqlalchemy/ext/declarative.py index feee435ed1..39aaf54880 100755 --- a/lib/sqlalchemy/ext/declarative.py +++ b/lib/sqlalchemy/ext/declarative.py @@ -827,80 +827,6 @@ from multiple collections:: id = Column(Integer, primary_key=True) -Defining Indexes in Mixins -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you need to define a multi-column index that applies to all tables -that make use of a particular mixin, you will need to do this in a -metaclass as shown in the following example:: - - from sqlalchemy.ext.declarative import DeclarativeMeta - - class MyMixinMeta(DeclarativeMeta): - - def __init__(cls,*args,**kw): - if getattr(cls,'_decl_class_registry',None) is None: - return - super(MyMeta,cls).__init__(*args,**kw) - # Index creation done here - Index('test',cls.a,cls.b) - - class MyMixin(object): - __metaclass__=MyMixinMeta - a = Column(Integer) - b = Column(Integer) - - class MyModel(Base,MyMixin): - __tablename__ = 'atable' - c = Column(Integer,primary_key=True) - -Using multiple Mixins that require Metaclasses -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you end up in a situation where you need to use multiple mixins and -more than one of them uses a metaclass to, for example, create a -multi-column index, then you will need to create a metaclass that -correctly combines the actions of the other metaclasses. For example:: - - class MyMeta1(DeclarativeMeta): - - def __init__(cls,*args,**kw): - if getattr(cls,'_decl_class_registry',None) is None: - return - super(MyMeta1,cls).__init__(*args,**kw) - Index('ab',cls.a,cls.b) - - class MyMixin1(object): - __metaclass__=MyMeta1 - a = Column(Integer) - b = Column(Integer) - - class MyMeta2(DeclarativeMeta): - - def __init__(cls,*args,**kw): - if getattr(cls,'_decl_class_registry',None) is None: - return - super(MyMeta2,cls).__init__(*args,**kw) - Index('cd',cls.c,cls.d) - - class MyMixin2(object): - __metaclass__=MyMeta2 - c = Column(Integer) - d = Column(Integer) - - class CombinedMeta(MyMeta1,MyMeta2): - # This is needed to successfully combine - # two mixins which both have metaclasses - pass - - class MyModel(Base,MyMixin1,MyMixin2): - __tablename__ = 'awooooga' - __metaclass__ = CombinedMeta - z = Column(Integer,primary_key=True) - -For this reason, if a mixin requires a custom metaclass, this should -be mentioned in any documentation of that mixin to avoid confusion -later down the line. Class Constructor =================