9

私が使用するもの: Python 2.6 および sqlalchemy 0.6.1

これは私がやろうとしていることです:

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)

そして、私が得ているエラーはこれです:

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)

それは絶対にうまくいきます。

クラスの属性を動的に更新する必要があります。したがって、動的な属性と列名を使用します。そして、そこにたどり着くためには、上記のピースコードが機能する必要があります。

助けてください

4

2 に答える 2

-1

zzzeek によって提案された多重継承では問題を解決できない場合は、DeclarativeMeta から MetaClass を継承してみてください。

from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta

Base = declarative_base()

class SampleMeta(DeclarativeMeta):
    #...

class Sample(Base):
    __metaclass__ = SampleMeta
    #...
于 2015-02-04T08:37:40.097 に答える