On Tuesday, October 23, 2012 10:35:54 PM UTC-7, Jeremy Evans wrote:

> On Tuesday, October 23, 2012 6:54:16 PM UTC-7, GregD wrote:
>
>> It looks like after the insert the key returned is not found in a 
>> followup select.   It is trying to do a select on id 1.  The table is still 
>> empty for some reason.
>>
>> et = Tournament.first
>> TournamentConfiguration.create(:tournament => et)
>>
>>
>> (0.031481s) SELECT * FROM `tournaments` LIMIT 1
>> (0.000198s) SELECT sqlite_version() LIMIT 1
>> (0.000074s) BEGIN
>> (0.001818s) INSERT INTO `tournament_configurations` (`tournament_id`) 
>> VALUES (1)
>> (0.000181s) SELECT * FROM `tournament_configurations` WHERE (`id` = 1) 
>> LIMIT 1
>> (0.000409s) ROLLBACK
>>
>
> See that ROLLBACK?  For some reason, the transaction is rolling back and 
> not committing.  So naturally nothing is persisted in that case.  You'll 
> need to find out what is causing that ROLLBACK.  Normal inserts don't cause 
> that.  Since it occurs after the SELECT * query, it isn't even occuring in 
> an after_save or similar hook.  The only thing I can think of that would 
> cause what you are seeing without an exception being raised is if the 
> transaction is being manually rolled back via a surrounding 
> transaction(:rollback=>true), raising Sequel::Rollback after save returns, 
> or manually swallowing the exception.
>

I wasn't thinking too clearly when I wrote that, I needed to get some fresh 
night air.  Putting the SQL log together with the backtrace and your 
comments, the ROLLBACK is obviously caused by the the Sequel::Model code 
after the SELECT * query returns 0 rows.

So the question becomes why SQLite or the Sequel adapter in use isn't 
returning the correct inserted id.  First, which Sequel adapter are you 
using to access SQLite (sqlite, jdbc, swift, do, amalgalite, etc.?), and 
what is the schema for the tournament_configurations table (use ".dump 
tournament_configurations" from the sqlite3 command prompt and post the 
output)?  If you call 
DB[:tournament_configurations].insert(:tournament_id=>1) a few times, does 
it return 1 every time, or does it increment? 

All Sequel adapters I test that can access SQLite return the correct 
autoincremented primary key upon insert, so I'm not sure what could be 
causing your error, but knowing the adapter in use and the schema for the 
table is the first step towards diagnosing the issue.

If I had to guess at this point, tournament_configurations.id is not 
declared as an INTEGER PRIMARY KEY in SQLite, so insert is return the value 
of tournament_configuration.rowid (the hidden integer primary key).  Since 
you are looking for tournament_configurations.id = 1, no row is found. 
 SQLite is nonstandard in that if you declare a PRIMARY KEY field with a 
non-INTEGER type, that column can have NULL values (unless you explicitly 
set the column as NOT NULL).  The table schema dump from SQLite should make 
it obvious whether that guess is accurate.

Jeremy

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sequel-talk/-/j6NQ1NWgmxwJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sequel-talk?hl=en.

Reply via email to