2013-07-03 3 views
8

에서 확장 클래스의 메타 클래스를 정의하는 방법 :은 내가 사용 SQLAlchemy의 선언적 기본

from sqlalchemy.types import (
    Integer, 
    String, 
    Boolean 
) 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class SampleMeta(type): 
    def __new__(cls, name, bases, attrs): 
     attrs.update({ 'id': Column('Id', Integer, primary_key=True), 
        'name': Column('Name', String), 
        'description': Column('Description', String), 
        'is_active': Column('IsActive', Boolean) 
       }) 
     return super(SampleMeta, cls).__new__(cls, name, bases, attrs) 

class Sample(Base): 
    __tablename__ = 'Sample' 
    __table_args__ = {'useexisting': True} 
    __metaclass__ = SampleMeta 

    def __init__(self, id, name, description, is_active): 
     self.id = id 
     self.name = name 
     self.description = description 
     self.is_active = is_active 

    def __repr__(self): 
     return "<(%d, '%s', '%s', %r)>" % (self.id, self.name, self.description, self.isactive) 

그리고 오류 I을 : 파이썬 2.6 SQLAlchemy의 0.6.1

이것은 내가 뭘하려고 오전입니다 나는 점점이 있습니다 : 지금

TypeError: Error when calling the metaclass bases 
    metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases 

을 나는

class Sample(object) 
를 사용하여 위와 같은 일을 할 경우

대신

class Sample(Base) 

의 그것은 절대적으로 잘 작동합니다.

동적으로 클래스의 속성을 업데이트해야합니다. 따라서 동적 속성 및 열 이름을 사용하게 될 것입니다. 그리고 거기에 도착하기 위해서는 위의 코드가 필요합니다.

답변

8

는 메타 클래스를 사용하도록 도와주세요,이 경우 Declaratives DeclaredMeta에서 파생 할 것이다. 그러나이 사용 사례에는 메타 클래스가 필요하지 않습니다. mixins 사용

from sqlalchemy.types import (
    Integer, 
    String, 
    Boolean 
) 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column 

Base = declarative_base() 

class SampleMixin(object): 
    id = Column("Id", Integer, primary_key=True) 
    name = Column("Name", String) 
    description = Column("Description", String) 
    is_active = Column("IsActive", Boolean) 

class Sample(SampleMixin, Base): 
    __tablename__ = 'Sample' 
    __table_args__ = {'useexisting': True} 

    def __init__(self, id, name, description, is_active): 
     self.id = id 
     self.name = name 
     self.description = description 
     self.is_active = is_active 

    def __repr__(self): 
     return "<(%d, '%s', '%s', %r)>" % (self.id, self.name, 
           self.description, self.isactive) 

from sqlalchemy import select 
print select([Sample.id, Sample.name]) 
+0

다중 상속 .... 천재 .... SQLAlchemy의의 창조자에서 예상대로. – goFrendiAsgard

-1

를 문제가 DeclarativeMeta에서 메타 클래스 상속하려고 해결할 수없는 zzzeek 다중 상속에 의해 제안 된 경우

from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta 

Base = declarative_base() 

class SampleMeta(DeclarativeMeta): 
    #... 

class Sample(Base): 
    __metaclass__ = SampleMeta 
    #...