is this joined inheritance or concrete? IMO if Product inherits Node, they has to have same PK?
On Thursday 12 February 2009 23:56:12 Bruce van der Kooij wrote: > Many thanks Michael, your instructions were spot-on. In the process > of following your instructions I decided to switch from using > ext.declarative to a non-declarative style (define tables, define > Python objects, setting up the mapping, the works :-). > > Regretfully while trying to work out the rest of the model (see > ASCII diagram below) I hit another wall. I'm currently trying to > make the model Product inherit from Node, I'm having issues with > this because the situation I'm faced with deviates from the > excellent examples in the documentation. > > +--------------+ +--------------+ > > | Node | | User | > > +--------------+ 1 +--------------+ > > | nid (PK, AI) | /--->| uid (PK, AI) | > | vid | 0..* / +--------------+ > | uid |------/ > > +--------------+ > ^ > > | is subclass of > > +-------------+ > > | Product | > > +-------------+ > > | vid (PK) | > | nid | > > +-------------+ > > The User relation is irrelevant, but I added it to present "the > full picture". I also excluded the relation with the NodeRevision > model since I already posted that above. > > Creating a Product instance, adding it to the session and > committing it results in a node, a revision and a product. However > the problem that arises is that the row for the Product table will > not have the correct vid (it will remain on the default value, not > with the vid of the NodeRevision associated with the Node). > Subsequent INSERTS will then fail (duplicate entry). I'm led to > believe that the problem stems from the fact that the primary key > for the products table differs from that of the node table (vid > compared to nid). > > I haven't yet managed to figure out a solution to this predicament, > I'll probably look into multi-table mapping next to see if that > might help. > > Here's what I've managed to get so far: > > # tables.py: > node_table = Table("node", metadata, > Column("vid", Integer, ForeignKey("node_revisions.vid")), > Column("uid", Integer, ForeignKey("users.uid")), > autoload=True > ) > > node_revisions_table = Table("node_revisions", metadata, > Column("nid", Integer, ForeignKey("node.nid")), > Column("uid", Integer, ForeignKey("users.uid")), > autoload=True > ) > > uc_products_table = Table("uc_products", metadata, > Column("vid", Integer, ForeignKey("node_revisions.vid"), > primary_key=True), > Column("nid", Integer, ForeignKey("node.nid")), > autoload=True > ) > > # models.py (simplified): > class Node(object): > pass > > class NodeRevision(object): > pass > > class Product(Node): > pass > > # database.py (mapping): > node_mapper = mapper(Node, node_table, > polymorphic_on=node_table.c.type, > properties={ > "user": relation(User), > "latest_revision": relation(NodeRevision, > primaryjoin=node_table.c.vid == > node_revisions_table.c.vid, > post_update=True > ), > "revisions": relation(NodeRevision, > primaryjoin=node_table.c.nid == > node_revisions_table.c.nid, > backref=backref("node", > primaryjoin=node_revisions_table.c.nid == > node_table.c.nid > ) > ) > } > ) > > node_revision_mapper = mapper(NodeRevision, node_revisions_table, > properties={ > "user": relation(User) > }) > > uc_products_mapper = mapper(Product, uc_products_table, > polymorphic_identity="product" > ) > > # Example of creating a product (user relation left out for > simplicity): > product = Product(). > product.latest_revision = NodeRevision(node=product) > > Thanks for all your help. > > Best regards, > > Bruce > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---