新分配的序列不起作用
在PostgreSQL中,我创建了一个新表并为id
列分配了一个新序列。 如果我从PostgreSQL控制台插入一条记录它可以工作,但是当我尝试从Rails导入一个记录时,它会引发一个exception,它无法找到相关的序列。
这是表格:
\d+ user_messages; Table "public.user_messages" Column | Type | Modifiers | Storage | Description -------------+-----------------------------+------------------------------------------------------------+----------+------------- id | integer | not null default nextval('new_user_messages_id'::regclass) | plain |
但是当我尝试使用Rails使用的SQL查询获取序列时,它返回NULL:
select pg_catalog.pg_get_serial_sequence('user_messages', 'id'); pg_get_serial_sequence ------------------------ (1 row)
Rails引发的错误是:
UserMessage.import [UserMessage.new] NoMethodError: undefined method `split' for nil:NilClass from /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:910:in `default_sequence_name'
仅当我使用ActiveRecord扩展名导入批量记录时,才会出现此问题,单个记录通过ActiveRecord保存。
我如何解决它?
我认为您的问题是您手动设置所有这些而不是使用serial
列。 当您使用serial
列时,PostgreSQL将创建序列,设置适当的默认值,并确保序列由所讨论的表和列所有。 从精细手册 :
pg_get_serial_sequence(table_name, column_name)
获取serial或bigserial列使用的序列的名称
但是你没有使用serial
或bigserial
所以pg_get_serial_sequence
无济于事。
您可以通过以下方式解决此问题:
alter sequence new_user_messages_id owned by user_messages.id
我不确定这是否是一个完整的解决方案,有人(嗨Erwin)可能会填补缺失的位。
使用serial
作为id
列的数据类型,可以在这里省去一些麻烦。 这将为您创建和连接序列。
例如:
=> create sequence seq_test_id; => create table seq_test (id integer not null default nextval('seq_test_id'::regclass)); => select pg_catalog.pg_get_serial_sequence('seq_test','id'); pg_get_serial_sequence ------------------------ (1 row) => alter sequence seq_test_id owned by seq_test.id; => select pg_catalog.pg_get_serial_sequence('seq_test','id'); pg_get_serial_sequence ------------------------ public.seq_test_id (1 row)
- Rails 4.1 ActiveRecord :: relation不再像Array一样
- Rails 5 db migration:如何修复ActiveRecord :: ConcurrentMigrationError
- 有没有办法使用AREL进行自定义关联?
- 如何检查一个数字是否在activerecord范围内?
- 类的超类不匹配用户 – 从ActiveRecord :: Baseinheritance
- rails Active Record中的attr_accessible
- Rails按关联数据排序
- Ruby on Rails:数据没有保存ActiveRecord
- 使用PostgreSQL使用ActiveRecord准备和执行语句