On Sep 29, 2008, at 11:01 AM, Joril wrote:

>
> Hi everyone!
> I'm new to SQLAlchemy and I'm using version 0.5rc1..
> I need every entity class to have a few common fields, so I tried
> writing an "abstract" base class, declarative-style, that every other
> entity class would subclass. So for example:
>
> ---
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy import Column, String, DateTime, Integer
>
> ORMBase = declarative_base()
>
> class BaseObject(ORMBase):
>    id = Column(Integer, primary_key=True)
>    creation_time = Column(DateTime)
>    modify_time = Column(DateTime)
>
> class TestEntity(BaseObject):
>    value = Column(String)
> ---
>
> But SQLAlchemy complains that
> sqlalchemy.exc.ArgumentError: Mapper 'Mapper|BaseObject|None' does not
> have a mapped_table specified.  (Are you using the return value of
> table.create()?  It no longer has a return value.)
>
> Is there a way to tell SQLAlchemy to treat BaseObject like a non-
> mapped-class? I tried using ORMBase as mixin to TestEntity (so
> BaseObject extends object and TestEntity extends BaseObject and
> ORMBase), but now I get a
>
> sqlalchemy.exc.ArgumentError: Mapper Mapper|TestEntity|tests could not
> assemble any primary key columns for mapped table 'tests'
>
> so I guess that maybe I'm going down the wrong road.. Am I doing
> something that Declarative doesn't like? :) Should I try Elixir
> instead?
>
> Many thanks for your time!

the "Column" objects that are present on each declarative class are  
unique to that class, so the creation of those three Column objects  
would have to occur for each class.  This suggests that the correct  
approach would be to extend the declarative metaclass to provide this  
behavior:

from sqlalchemy import *
from sqlalchemy.ext.declarative import DeclarativeMeta, declarative_base

class MyDefaults(DeclarativeMeta):
     def __init__(cls, classname, bases, dict_):
         dict_['id'] = Column(Integer, primary_key=True)
         dict_['creation_time'] = Column(DateTime)
         dict_['modify_time'] = Column(DateTime)
         return DeclarativeMeta.__init__(cls, classname, bases, dict_)

Base = declarative_base(metaclass=MyDefaults)

class TestEntity(Base):
     __tablename__ = 'test'
     value = Column(String)

print TestEntity.id == 5
print TestEntity.creation_time



--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to