OK, thank you, I went back to SQLA and came up with this for now (simplified): -------------------------------------------------------- class Pairs(Base): __tablename__ = 'Pairs' name = Column(String(20), primary_key=True) other_name = Column(String(20), ForeignKey('Pairs.name'), nullable = False)
other = relationship('Pairs', primaryjoin = 'Pairs.name == Pairs.other_name', remote_side=[name]) def __init__(self, name): self.name = name def __repr__(self): return "(%s, %s)" % (self.name, self.other.name) def pair(name1, name2): p1, p2 = Pairs(name1), Pairs(name2) p1.other_name = name2 p2.other_name = name1 return p1, p2 if __name__ == '__main__': p1, p2 = pair('apple', 'pear') session.add_all([p1, p2]) session.commit() for p in session.query(Pairs).all(): print p assert p1.other.other is p1 ------------------------------------------ Note that there is no backref on "other" and that the primaryjoin is completely written out (otherwise a got a mysterious (to me) error, when using joined inheritance at the same time). This solution is key to my datamodel. Does anyone see any drawbacks? Cheers, Lars On Feb 5, 10:50 am, Gaëtan de Menten <gdemen...@gmail.com> wrote: > On 02/03/2012 12:08 PM, lars van gemerden wrote: > > > > > > > > > I should probably make the pair method: > > > def pair(name1, name2): > > p1, p2 = Pairs(name1), Pairs(name2) > > p1.other = p2 > > p2.other = p1 > > > On Feb 3, 11:57 am, lars van gemerden<l...@rational-it.com> wrote: > >> Hi, I am trying to sote pairs in a table as follows: > > >> #-------------------------------------------------------------------------- > >> ------------ > >> from elixir import * > > >> metadata.bind = "sqlite:///:memory:" > >> metadata.bind.echo = False > > >> class Pairs(Entity): > >> name = Field(String(50), primary_key = True) > >> other = OneToOne('Pairs', inverse = 'other') > > You can't have a OneToOne as inverse for a OneToOne, even less for > itself. Valid relationship pairs are: > > ManyToOne - OneToOne > ManyToOne - OneToMany > ManyToMany - ManyToMany > > In your case you want: > > class Pairs(Entity): > name = Field(String(50), primary_key = True) > other1 = ManyToOne('Pairs', inverse = 'other2') > other2 = OneToOne('Pairs', inverse = 'other1') > > and if your database really only stores pairs, a property might make it > more elegant: > > @property > def other(self): > return self.other1 if self.other1 is not None else self.other2 > > As a side note, you probably do not want to use Elixir for a new > project, as Elixir is not maintained anymore. > > -G. -- 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.