4

誰でもこれを説明できますか?Populator および Faker gem を使用して、生成されたデータをデータベースに入れています。とりわけ、10,000 件のコメント (「acts_as_commentable」gem からのもの) を生成します。これはすべて機能します。ただし、新しいコメントを追加しようとすると、既存の ID を使用して主キーに違反しているというエラーが表示されます。 . 以下のコンソール出力を見てください. ID 1 で始まり ID 100000 で終わる 10,000 レコードがあることがわかります. 次に新しいコメントを追加しようとすると失敗します. これはこのモデル/テーブルでのみ発生します. 追加できます新規ユーザーなど

>> Comment.first(:order => 'id').id
=> 1
>> Comment.last(:order => 'id').id
=> 10000
>> Comment.count
=> 10000
>> Comment.create(:title => 'wtf is up?')
ActiveRecord::RecordNotUnique: PGError: ERROR:  duplicate key value violates unique constraint "comments_pkey"
DETAIL:  Key (id)=(1) already exists.

これは、Populator gem がレコードをデータベースにバッチ処理する方法に関連していると思われます。Populator で見られるモデル/テーブルでのみ発生しています。

4

3 に答える 3

5

これは、id 列の値が挿入ステートメントで明示的に設定されている場合に発生します。

すべての ID 列に対して、Postgres にはシーケンスがあり、通常は、user_id_seq のように、tablename_columnname_seq という名前が付けられます。

Railsは他の名前のシーケンスをサポートしていないため、pgadmin3のテーブル定義で名前を確認してください。

次のようなものを実行することで、ID が低すぎるシーケンスを修正できます。

SELECT setval('user_id_seq', 10000);

最大数を知るには: SELECT max(id) FROM users;

SELECT max(x) FROM 
   (SELECT max(id) As x FROM users
    UNION SELECT last_value As x FROM user_id_seq As y);
于 2010-11-13T14:59:21.523 に答える
0

実際の問題が何かはわかりませんが、Populator gem を使用してレコードを追加することに関連していることは確かです。以下を使用してデータを生成します。

Populator.sentences(1..3) # makes 3 sentences

結構です。

ただし、次のようなレコードを生成します

User.populate 5000 do |user| # makes 5000 users in batches of 1000
   user.name = Populator.words(1)
   ...
end

そこに何かが私の問題を引き起こしています。Rails 3.0.1を使用していることに注意してください

于 2010-11-13T14:24:06.097 に答える
0

これは、すべてのテーブルのシーケンスを一度に修正するための便利な PostreSQL スクリプトです。

SELECT  'SELECT SETVAL(' ||quote_literal(quote_ident(S.relname))|| ', MAX(' ||quote_ident(C.attname)|| ') ) FROM ' ||quote_ident(T.relname)|| ';'
FROM pg_class AS S, pg_depend AS D, pg_class AS T, pg_attribute AS C
WHERE S.relkind = 'S'
AND S.oid = D.objid
AND D.refobjid = T.oid
AND D.refobjid = C.attrelid
AND D.refobjsubid = C.attnum
ORDER BY S.relname;
于 2013-12-04T14:25:40.387 に答える