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()