gpt4 book ai didi

ruby-on-rails - 新分配的序列不起作用

转载 作者:行者123 更新时间:2023-11-29 11:40:53 24 4
gpt4 key购买 nike

在 PostgreSQL 中,我创建了一个新表并将新序列分配给 id 列。如果我从 PostgreSQL 控制台插入一条记录,它可以工作,但是当我尝试从 Rails 导入一条记录时,它会引发一个异常,它无法找到关联的序列。

这是表格:

\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 将创建序列,设置适当的默认值,并确保序列由相关表和列拥有。来自fine manual :

pg_get_serial_sequence(table_name, column_name)
get name of the sequence that a serial or bigserial column uses

但是你没有使用 serialbigserial 所以 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)

关于ruby-on-rails - 新分配的序列不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10546850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com