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.