Hello all,
I used to develop using Rais + Mysql, now I need to switch to
Postgresql.
I can't figure out why ActiveRecord cannot find the sequence needed for
incrementing the id of my table.
The name of the table is users, the name of the sequence is
users_id_seq: (is this the orrect name? )
CREATE TABLE users (
id int,
first_name varchar(50),
constraint users_pkey PRIMARY KEY (id)
);
CREATE SEQUENCE users_id_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
Well, saving a new records fails:
> ruby script\runner "a = User.new(:first_name => 'Jack') ; a.save"
c:/ruby/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/commands/runner.rb:27:
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_adapters/abstract_adapter.rb:120:in
`log':
RuntimeError: ERROR C23502 Mnull value in column "id" violates
not-null constraint FexecMain.c L1806 RExecConstraints:
INSERT INTO users ("first_name") VALUES('Jack')
(ActiveRecord::StatementInvalid)
Ok, well, then I set the sequence manually:
class User < ActiveRecord::Base
set_sequence_name "users_id_seq"
end
It has no effect! It's rather annoying.
What am I missing here?
Best regards,
Yuri
P.S.
I am using
postgres-pr (0.4.0)
rails (1.1.6)
activerecord (1.14.4)
postgresql 8.1
on 2006-09-19 17:21
on 2006-09-19 18:06
Or am I supposed to use
id int default nextval('users_id_seq') ?
Am I right?
I thought Postgres adaptor will handle it by itself, but I didn't find
in in the source code.
Best regards
Yuri
on 2006-09-19 21:37
On 9/19/06, Yuri Leikind <yuri.leikind@gmail.com> wrote: > > Or am I supposed to use > > id int default nextval('users_id_seq') ? > > Am I right? > > I thought Postgres adaptor will handle it by itself, but I didn't find > in in the source code. id must have a default nextval. The postgres adapter will deduce it if you provide it. Defining your tables with id serial primary key is the typical idiom. jeremy
on 2006-09-20 11:00
Hi, Jeremy Kemper wrote: > > > id must have a default nextval. The postgres adapter will deduce it if you > provide it. > > Defining your tables with > id serial primary key > is the typical idiom. Well, I read the source code of ActiveRecord::Base and the postgres-pr adaptor and found out that the deduction you are referring to works only for figuring out the id of the record just created: def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc: execute(sql, name) table = sql.split(" ", 4)[2] id_value || last_insert_id(table, sequence_name || default_sequence_name(table, pk)) end Well, that's ok, I'm fine with the rdbms taking care of incrementing the pk, I just had false expectations about Active Record, because in some O/R Mappers I used in the past (OJB) you can configure it to take care of the PKs. Well, problem's solved, no, there's no problem, I'm pretty happy with ActiveRecord. Yuri
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.