All pastes #935898 Raw Edit

Someone

public text v1 · immutable
·published 2008-03-10 00:12 UTC
rendered paste body
from sqlalchemy import *
from sqlalchemy.orm import *

from sqlalchemy.orm.interfaces import MapperProperty

meta = MetaData(create_engine('sqlite://', echo=True))

class Thingy(type):
    def __init__(cls, classname, bases, dict_):
        if classname == 'Magic':
            return type.__init__(cls, classname, bases, dict_)
            
        tablename = cls.__tablename__
        our_stuff = dict([(k, dict_[k]) for k in dict_ if isinstance(dict_[k], (Column, MapperProperty))])
        t = Table(tablename, meta, *[
            c for c in our_stuff.values() if isinstance(c, Column)
        ])
        mapper(cls, t, properties=our_stuff)
        return type.__init__(cls, classname, bases, dict_)
        
class Magic(object):
    __metaclass__ = Thingy
    def __init__(self, **kwargs):
        for k in kwargs:
            setattr(self, k, kwargs[k])
            
class User(Magic):
    __tablename__ = 'users'
    
    id = Column('id', Integer, primary_key=True)
    name = Column('name', String(50))
    
    
class Address(Magic):
    __tablename__ = 'addresses'

    id = Column('id', Integer, primary_key=True)
    email = Column('email', String(50))
    user_id = Column('user_id', Integer, ForeignKey('users.id'))
    user = relation(User, backref='addresses')


meta.create_all()

sess = create_session()

u1 = User(name='ed', addresses=[Address(email='eds email')])

sess.save(u1)
sess.flush()