I have several types of user account records.  I'm trying to use
joined-table inheritance to manage them, but I can't figure out how to
create an instance of account type B based on an instance of account
type A.

I'm using 0.4.8.  Is this possible?  Is it sane?


def experiment_part1():
    # Otto registers with a password....
    otto = PasswordUser('otto')
    otto.password = 'honk'
    session.add(otto)
    session.flush()

def experiment_part2():
    # ...later, otto wants to log in using kerberos or openid or
something.  I need
    # to create an ExternalUser instance based on the existing User
instance.
    global otto
    otto = session.query(User).filter_by(username='otto').one()


### Set up
import sqlalchemy
from sqlalchemy.schema import Table, Column, ForeignKey
from sqlalchemy.types import String, Unicode, Integer
from sqlalchemy.orm import mapper, class_mapper

metadata = sqlalchemy.MetaData(bind='sqlite:///:memory:')
Session = sqlalchemy.orm.sessionmaker()

session = Session(bind=metadata.bind)

### Tables
user_table = Table('users', metadata,
    Column('user_id', Integer, primary_key=True),
    Column('username', Unicode(60), nullable=False),
)

password_user_table = Table('password_users', metadata,
    Column('password_user_id', Integer, primary_key=True),
    Column('user_id', Integer, ForeignKey('users.user_id'),
nullable=False),
    Column('password', String(40), nullable=False),
)

external_user_table = Table('external_users', metadata,
    Column('external_user_id', Integer, primary_key=True,
autoincrement=False),
    Column('user_id', Integer, ForeignKey('users.user_id'),
nullable=False),
)

### Classes
class User(object):
    def __init__(self, username):
        self.username = username
    def __repr__(self):
        return '<%s: %s>' % (self.__class__.__name__, self.username)
class PasswordUser(User): pass
class ExternalUser(User): pass

mapper(User, user_table)
mapper(ExternalUser, external_user_table, inherits=class_mapper(User))
mapper(PasswordUser, password_user_table, inherits=class_mapper(User))


metadata.create_all()

### Experiments
experiment_part1()
experiment_part2()


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected]
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