<div dir="ltr">Hi Arthur!<br><br>When Pony stores objects to the database, it needs to determine the order of inserts. This order of inserts cannot be arbitrary, because of referential integrity constraints. We cannot insert a row which references to another row, if that another row is not exists in the database yet.<br><br>In simple cases Pony can determine valid order of inserts automatically. But in your example there are cyclic references between objects. Pony cannot insert object `ID` with primary key "a", because Pony doesn't know which value to write to the `canonicalEquivalent` column (because the `EquivalentIDset` object is not exists in the database yet). But Pony cannot first save `EquivalentIDset` object also, because referential integrity rules prevent it to store value of "a" in `canonicalID` attribute.<br><br>In order to break the cycle you can perform `flush()` command before creating `EquivalentIDset` object:<br><br><div>    a = ID(identifier='a')</div><div>    b = ID(identifier='b')</div><div>    flush()</div><div>    EquivalentIDset(equivalentIDs=[a, b], canonicalID=a)</div><div><br></div>The `flush()` command forces Pony to store already created `ID` objects. At this moment the saving is possible, because `substituteIDs` and `canonicalEquivalent` attributes of newly created objects don't refer to any object yet, and contain None as a value.<br><br>After the `flush()` command is executed, Pony can save `EquivalentIDset` object successfully, because the `ID` object referenced in the `canonicalID` attribute is already stored in the database. After the `EquivalentIDset` object is inserted, Pony will update `a` and `b` objects in order to link them with newly created `EquivalentIDset` object.<br><br>Another option is to store all objects right away, but set the value of `canonicalID` attribute separately after the `flush` command:<br><br><div>    a = ID(identifier='a')</div><div>    b = ID(identifier='b')</div><div>    idset = EquivalentIDset(equivalentIDs=[a, b])<br></div><div><div>    flush()<br>    idset.canonicalID = a</div></div><div><br></div><br>Regards,<br>Alexander<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Nov 2, 2014 at 7:57 PM, Goldberg, Arthur P <span dir="ltr"><<a href="mailto:arthur.p.goldberg@mssm.edu" target="_blank">arthur.p.goldberg@mssm.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div>
<div><font><span style="font-size:10pt">
<div>Hi Folks<br>
<br>
I'm building an alias dbms. Multiple aliases can refer to the same person (genetics subject). I've two main entities: ID, an identifier; and an EquivalentIDset, which points to a set of aliased IDs. EquivalentIDset needs to be a separate entity, so it can have
 attributes. One of those attributes is canonicalID, the primary ID (if any) among the set.
<br>
<br>
However, when I set canonicalID and scan through the IDs, I get a 'Cannot save cyclic chain' exception. Here's an (almost) freestanding extract of my code that generates the error:<br>
<br>
</div>
</span></font></div>
<div><font><span style="font-size:10pt">
<div><br>
<br>
What does the exception mean?<br>
<br>
What's the best way to handle this? My thought is to not define canonicalID as an entity reference, but as a string equal to ID.identifier. But that would lose the dbms consistency benefits. Suggestions?<br>
<br>
Thanks<br>
Arthur<br>
<br>
PS:<br>
$ pip show pony<br>
---<br>
Name: pony<br>
Version: 0.5.4<br>
Location: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages<br>
<br>
</div>
</span></font></div>
</div>

<br>_______________________________________________<br>
ponyorm-list mailing list<br>
<a href="mailto:ponyorm-list@ponyorm.org">ponyorm-list@ponyorm.org</a><br>
<a href="/ponyorm-list" target="_blank">/ponyorm-list</a><br>
<br></blockquote></div><br></div>