I think I may have answered my own question.   See below.

  class Rule < Sequel::Model(:nm_requests)

    self.dataset = self.dataset.sequence(:seq_nm_req_id)


With the above, I should be able to use automatic sequences in Sequel even 
when the sequences/triggers are created externally and with custom naming. 
 Am I on track?

I'm working with an Oracle DBA on a project and there is a lot of overlap 
in our tools.  Having the flexibility to confirm to his work is very 
helpful.


On Monday, July 16, 2012 4:59:05 PM UTC-4, Jason Hines wrote:
>
> Thanks Jeremy for the response.  Using the autosequence worked for the 
> project I was working on at the time.   For a different project, the 
> sequences are created outside of Sequel and I'm having the same problem as 
> above.
>
> Looking at your response from before:
>
>  Server.dataset = Server.dataset.sequence(:sequence_name)
>
> I'm not sure I understand where to use this.  Can it not be specified by 
> the model somehow?  (self.sequence_name = 'foo') ?
>
>
> Thanks for any clarification here, i"ll keep poking around.
>
>
> On Wednesday, April 18, 2012 11:29:28 AM UTC-4, Jeremy Evans wrote:
>>
>> On Wednesday, April 18, 2012 6:56:19 AM UTC-7, Jason Hines wrote:
>>>
>>> Using the following gems on Oracle 11g
>>>
>>> gem 'sequel', '3.32.0'
>>> gem 'ruby-oci8', '2.1.0'
>>>
>>> I have the following table in place:
>>>
>>>  DB.create_table :servers do
>>>   primary_key :id
>>>   String :site
>>>   String :p4port
>>>   String :service
>>>   String :monitored
>>>  end
>>>
>>> I have a working sequence and trigger in place to provide auto_increment 
>>> functionality when inserting into this table.
>>>
>>> I can verify that this works by issuing an INSERT SQL statement directly 
>>> (omitting the id field) into an Oracle client.
>>>
>>> In Rails, my controller attempts to create a new record using Sequel 
>>> model:
>>>
>>>  # model
>>>  class Server < Sequel::Model
>>>  end
>>>
>>>  # controller
>>>  @server = Server.new
>>>  @server.site           = params[:site]
>>>  @server.p4port       = params[:p4port]
>>>  @server.service      = params[:service]
>>>  @server.monitored   = params[:monitored]
>>>  @server.save
>>>
>>> This results in the following error:
>>>
>>>  (0.000007s) Transaction.begin
>>>  (0.001127s) INSERT INTO "SERVERS" ("SITE", "P4PORT", "SERVICE", 
>>> "MONITORED") VALUES ('SVL', 'foobar:1666', 'PRODUCTION', 'Y')
>>>  (0.000891s) SELECT * FROM (SELECT * FROM "SERVERS" WHERE ("ID" IS 
>>> NULL)) "T1" WHERE (ROWNUM <= 1)
>>>  (0.003289s) Transaction.rollback
>>>  Completed 500 Internal Server Error in 10ms
>>>
>>>  Sequel::Error (Record not found):
>>>   app/controllers/admin/servers_controller.rb:18:in `create'
>>>
>>> (line 18 is the @server.save line)
>>>
>>>
>>> The WHERE ID IS NULL clause is suspicious, as it appears that the 
>>> trigger is not being fired.  I'm baffled by this because the trigger *does* 
>>> work properly outside of Sequel.
>>>
>>> Any ideas?
>>>
>>>  
>> Sequel needs Dataset#insert to return the inserted primary key value.  On 
>> Oracle, this doesn't happen by default, you need to set the sequence to 
>> use.  You can try:
>>
>>   DB.autosequence = true
>>
>> to assume that a sequence exists that matches Sequel's default sequence 
>> name format.  Since you are using Sequel to create the table, it should 
>> work.
>>
>> If you are not using Sequel to create the sequence, or you are using a 
>> non-default sequence name, you must manually set the sequence:
>>
>>   Server.dataset = Server.dataset.sequence(:sequence_name)
>>
>> 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/-/aXA6NhbZK_cJ.
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