rendered paste bodyfrom 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()