I am trying to use mappers to model a self-referential table with a
two-column primary key (id and version, used to track history).
Here's a minimal example:

#### Begin code ####

from sqlalchemy import *

meta = BoundMetaData('sqlite://', echo=True)

folder_table = Table('folder', meta,
    Column('id', Integer, primary_key=True),
    Column('version', Integer, primary_key=True),
    Column('name', String),
    Column('parent_id', Integer, ForeignKey('folder.id'), nullable=True),
    Column('parent_version', Integer, ForeignKey('folder.version'),
nullable=True),
    )

meta.create_all()

ins = folder_table.insert()
for id,version,name,parent_id,parent_version in [
    (1, 1, 'Top', None, None),
    (1, 2, 'Top (renamed)', None, None),
    (2, 1, 'Child #1', 1, 1),
    (2, 2, 'Child #1', 1, 2),
    (3, 1, 'Child #2', 1, 2),
    ]:
        ins.execute(id=id, version=version, name=name,
parent_id=parent_id, parent_version=parent_version)

class Folder(object):
    pass

mapper(Folder, folder_table, properties=dict(
    child_folders = relation(Folder, foreignkey=folder_table.c.parent_id),
    ))

ses = create_session()

top_v1, = ses.query(Folder).select_by(name='Top')
print [(f.id,f.version) for f in top_v1.child_folders] # should be
only one child

top_v2, = ses.query(Folder).select_by(id=1, version=2)
print [(f.id,f.version) for f in top_v2.child_folders] # should be two children

#### End code ####

The SQL generated for the child_folders property is not what I think
it should be, and I think that's because I can't pass multiple columns
in the foreignkey parameter to the relation.

Any suggestions? (other than "redesign your tables"... unfortunately I
can't do that).

Chris Perkins


_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to