The problem with using Mixins is that you need to know the definition of
columns already for creating the mixin class. What I am trying to do is
more like get the definition dynamically on the fly.Take a look at this:

def get_properties(tablename, map):
    table_inspector = reflection.Inspector.from_engine(DB_ENGINE.connect())
    table = Table(tablename, metadata)
    table_inspector.reflecttable(table, None)
    columns = []
    for child in table.get_children():
        if isinstance(child, Column):
            column = list(child.base_columns)[0]
            column.table = None
            columns.append(column)
    return dict([(map[column.key],  column) for column in columns])

class CustomDeclarativeMeta(DeclarativeMeta):
    def __new__(cls, name, bases, attrs):
        attrs.update(get_properties(attrs.get('__tablename__'),
attrs.get('__map__')))
        return super(CustomDeclarativeMeta, cls).__new__(cls, name, bases,
attrs)

# Base = declarative_base(metaclass=CustomDeclarativeMeta)
Base = declarative_base()

class Enum_SampleBase):
    __tablename__ = 'Enum_Sample'
    __table_args__ = {'useexisting': True}
    __metaclass__ = CustomDeclarativeMeta
    __map__ = {'Id': 'id', 'Name': 'name', 'Description': 'description',
'IsActive': 'is_active'}

    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)

Unfortunately, this isn't working. I want to declare column types by
getting them from a table that's already created in the database.



On Wed, Jul 3, 2013 at 11:11 AM, Michael Bayer <mike...@zzzcomputing.com>wrote:

> your metaclass must derive from the DeclarativeMeta class.
>
> Also, I disagree that you need this metaclass,  what you're trying to do
> is very easy using mixins, which are supported in version 0.6:
> http://docs.sqlalchemy.org/en/rel_0_6/orm/extensions/declarative.html#mixing-in-columns
>
>
>
>
> On Jul 3, 2013, at 12:44 AM, Ven Karri <praveen.venk...@gmail.com> wrote:
>
> I use: Python 2.6 and sqlalchemy 0.6.1
>
> This is what I am trying to do:
>
> 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)
>
> And the error I am getting is this:
>
>     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
>
> Now, if I do the same thing above by using
>
>     class Sample(object)
>
> instead of
>
>     class Sample(Base)
>
> it works absolutely fine.
>
> I need to update the attributes of the class dynamically. So, I will be
> using dynamic attribute and column names. And I need the above piece code
> to work in order to be able to get there.
>
> **Please help**
>
> --
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to sqlalchemy+unsubscr...@googlegroups.com.
>
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>
>
>  --
> You received this message because you are subscribed to a topic in the
> Google Groups "sqlalchemy" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/sqlalchemy/37M-1Qf8HO8/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>



-- 
Have a nice day !!!

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to