[英]How to define metaclass for a class that extends from sqlalchemy declarative base
我使用: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)
它工作得很好。
我需要動態更新類的屬性。 所以,我將使用動態屬性和列名稱。 我需要上面的代碼才能工作才能到達那里。
請幫忙
要使用元類,在這種情況下,它必須從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])
如果由zzzeek提出多重繼承無法解決您的問題,請嘗試從DeclarativeMeta繼承您的MetaClass:
from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta
Base = declarative_base()
class SampleMeta(DeclarativeMeta):
#...
class Sample(Base):
__metaclass__ = SampleMeta
#...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.