Hi,
I have a similar task, so I tried to use your proposal, but it didn't
work for me:
===
from sqlalchemy import types as satypes
from sqlalchemy import schema as saschema
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative import declarative_base,
DeclarativeMeta
from sqlalchemy.orm import scoped_session, sessionmaker
class BaseType(DeclarativeMeta):
def __init__(newcls, classname, bases, dict_):
newcls.notes = saschema.Column(satypes.String)
DeclarativeMeta.__init__(newcls, classname, bases, dict_)
MetaData = saschema.MetaData(bind=create_engine('sqlite:///:memory:'))
Session = scoped_session(sessionmaker(bind=MetaData.bind))
Base = declarative_base(metadata=MetaData, mapper=Session.mapper,
metaclass=BaseType)
class MasterEntity(Base):
__tablename__ = master
id = saschema.Column(satypes.Integer, primary_key=True)
status = saschema.Column(satypes.CHAR(length=1), default=A)
print [ _c.key for _c in MasterEntity.__table__.columns ]
# ['id', 'status']
# = the 'notes' column is missing
=== snip
So, what am I doing wrong?
Thanks in advance,
Frank
Btw.: Hello group and many thanks to Michael for this great piece of
software!
On Dec 16, 6:58 pm, Michael Bayer mike...@zzzcomputing.com wrote:
anabstractbaseclassisn't going to set up the same fields on all
descendants since the mapper()/Table() setup occurs during the
creation of the individualclassusing the non-inheritedclassdict,
and unique instances of each of the Column, etc. elements are required
as well.
concrete inheritance, as referenced in that post, was not designed
to be used as a configurational spacesaver and always requires a
mapped selectable for the base, which you don't have here, so it's
not appropriate for this use case.
So for this you'd need a custom metaclass:
classMyMeta(DeclarativeMeta):
def __init__(cls, classname, bases, dict_):
cls.notes = Column(String)
DeclarativeMeta.__init__(cls, classname, bases, dict_)
Base= declarative_base(metaclass=MyMeta)
On Dec 16, 2008, at 12:36 PM, Joril wrote:
Hi everyone!
I need to declare a few unrelated classes (from a business
perspective) that share some attributes/fields, so I thought I could
use anabstractclassto group these common attributes (note that just
a few classes should have them, not every one)
This post
http://groups.google.it/group/sqlalchemy/msg/d3de02f609a0bbd9?hl=it
suggests to use mixins, but I can't get it to work, SQLA generates the
tables without the common fields.
I'm testing it with this script:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
# --- Tables definition
Base= declarative_base()
classAbstract(object):
notes = Column(String)
classConcrete(Base,Abstract):
__tablename__ = 'concrete'
id = Column(Integer, primary_key=True)
# ---
# DB creation
engine = create_engine('sqlite:///:memory:', echo=True)
Base.metadata.create_all(engine)
Here's the sql call:
CREATE TABLE concrete (
id INTEGER NOT NULL,
PRIMARY KEY (id)
)
What am I missing? Did I misunderstood how the mixin should be used?
(I'm using SQLA 0.5rc4)
Many thanks!
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups
sqlalchemy group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~--~~~~--~~--~--~---