<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7638.1">
<TITLE>.get/find Triggers sqlite3.IntegrityError</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">Hi,</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">I</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&#8217;</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">m just getting to grips with Storm, so I apologise if this</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"> <FONT SIZE=2 FACE="Arial">is an error on my part.</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">I have a</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">n loop</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">, which calls a function</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">, passing a two dict objects</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">.</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp; I was trying to code the function so that it would handle new records, as well as modifying</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"> <FONT SIZE=2 FACE="Arial">existing records</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">.&nbsp; To do this, I was carrying out a find ( though I have tried get, as well ).&nbsp; If None was returned, I was creating a new object.&nbsp; If an object was found, it was ( hopefully )</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"> <FONT SIZE=2 FACE="Arial">returned, so I could update it</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">.</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp; However, when find/get is issued with a ID that exists, I</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&#8217;</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">m</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial"></FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"> <FONT SIZE=2 FACE="Arial">encounter</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">ing</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial"></FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"> <FONT SIZE=2 FACE="Arial">an sqlite3.IntegrityError</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">, as seen below</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">.</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"> <FONT SIZE=2 FACE="Arial">Is there something I</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&#8217;</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">m doing wrong?</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp; The function code is:</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">def insert( self, data</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">, updateDesc</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial"> ):</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; newObj = self._dbConn.find( Asset, Asset.assetID == int( data[</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"> <FONT SIZE=2 FACE="Arial">&#8216;</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">assetID</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&#8217;</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial"> ] ) ).one()</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; if newObj is None:</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newObj = Asset()</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newObj =</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"> <FONT SIZE=2 FACE="Arial">int( data[</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"> <FONT SIZE=2 FACE="Arial">&#8216;</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">assetID</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&#8217;</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial"> ] )</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._dbConn.add( newObj )</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; newObj.assetDesc = updateDesc</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; self._dbConn.flush</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; return newObj</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">The trackback is:</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp; File &quot;/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/storm/store.py&quot;, line 206, in find</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; self.flush()</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp; File &quot;/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/storm/store.py&quot;, line 486, in flush</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; self._flush_one(obj_info)</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp; File &quot;/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/storm/store.py&quot;, line 523, in _flush_one</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; result = self._connection.execute(expr)</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp; File &quot;/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/storm/database.py&quot;, line 203, in execute</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; raw_cursor = self.raw_execute(statement, params)</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp; File &quot;/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/storm/databases/sqlite.py&quot;, line 153, in raw_execute</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; return Connection.raw_execute(self, statement, params)</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp; File &quot;/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/storm/database.py&quot;, line 284, in raw_execute</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; self._check_disconnect(raw_cursor.execute, *args)</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp; File &quot;/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/storm/database.py&quot;, line 325, in _check_disconnect</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; return function(*args, **kwargs)</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">sqlite3.IntegrityError: PRIMARY KEY must be unique</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">I</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">&#8217;</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">m using Python 2.6.1/Storm 0.14 on OSX 10.5.6</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">.&nbsp; Any pointers would be much appreciated.</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">Thanks</FONT></SPAN></P>

<P ALIGN=LEFT><SPAN LANG="en-gb"><FONT SIZE=2 FACE="Arial">John</FONT></SPAN><SPAN LANG="en-gb"></SPAN><SPAN LANG="en-gb"></SPAN></P>

<br><br>
This email may contain information which is confidential and is intended only for use of the recipient/s named above. If you are not an intended recipient, you are hereby notified that any copying, distribution, disclosure, reliance upon or other use of the contents of this email is strictly prohibited. If you have received this email in error, please notify the sender and destroy it. "Think before you Print-please do not print this email unless you really need to"&nbsp; Balfour Beatty plc is registered in England as a public limited company; Registered No: 395826; Registered Office: 130 Wilton Road, London, SW1V 1LQ
</body>
</HTML>