2011-04-12 4 views
1

私はレールベースのウェブサイトのモデルを研究しており、ItemAttributesというモデルクラスを作成しました。これは特定のアイテムの有効な属性のセットを定義しています。たとえば、「ベッドサイズ」はアイテム「ベッド」の属性です。 'king' 'queen' full 'などの属性の有効な値を定義するAttributeValueクラスも作成しました。Heroku PostgreSQL Migration Issue

私は、herokuでPostgreSQLデータベースに移行を試みていますが、これはむしろ役に立たないエラー(移行がSQLiteの上でローカルに動作します):

class AddBedSizeValues < ActiveRecord::Migration 
    def self.up 
    id = ItemAttribute.find_by_name('bed size').id 

    AttributeValue.create(
     :name => 'king', 
     :item_attribute_id => id 
    ) 
    AttributeValue.create(
     :name => 'queen', 
     :item_attribute_id => id 
    ) 
    AttributeValue.create(
     :name => 'full', 
     :item_attribute_id => id 
    ) 
    AttributeValue.create(
     :name => 'x-long twin', 
     :item_attribute_id => id 
    ) 
    AttributeValue.create(
     :name => 'twin', 
     :item_attribute_id => id 
    ) 
    end 
+0

この移行ですべての「作成」を削除しようとしましたが、問題なく通過しました。移行に1つの作成だけを追加すると、同じエラーが返されます。 – kleptocrat

+1

Heroku開発者にとって悲嘆の原因の1つは、SQLiteをローカルで使用していることです。 PostgreSQLは無料です。それをダウンロードしてインストールし、SQLiteの使用をやめる。 –

答えて

1

を同じトランザクション内で以前に誤りがあった場合に、このエラーが与えられます。

PGError: ERROR: current transaction is aborted, commands ignored until end of transaction block 
:    SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull 
       FROM pg_attribute a LEFT JOIN pg_attrdef d 
       ON a.attrelid = d.adrelid AND a.attnum = d.adnum 
      WHERE a.attrelid = '"attribute_values"'::regclass 
       AND a.attnum > 0 AND NOT a.attisdropped 
      ORDER BY a.attnum 

ここでは、私が使用してい移行です。そのエラーを見つけて解決してください。特定のエラーが予想され、トランザクション全体をロールバックしたくない場合は、セーブポイントを使用できます。

編集、明確にするためにいくつかの明確化

、私は次のように流量が約だったエラーを見てきました例:

BEGIN; -- start of transaction 
SOME QUERY; -- Causes error but error is ignored 
SECOND QUERY; -- Causes the error you get because it is still in the same transaction 

エラーの後、トランザクションがロールバックされ、新しいなければなりません1つは、続行する前に開始したか、セーブポイントにロールバックする必要があります。

このエラーが発生する他の条件が発生した可能性がありますが、PGDATA/pg_logのログをチェックして、エンジンが何らかのエラーを記録していないかどうかを確認する必要があります。

これは役立たない場合は、移行中に実行されるすべての実際のクエリ(レールコードではなく)のログを作成することができます。

+0

私はあなたがこれによって何を意味するか分かりません。これらの属性値を作成する前にエラーがないことは確かです。上記の作成のうちの最初のものへの移行をスリム化しましたが、それでもエラーが発生します。すべての作成を削除すると、エラーが表示されなくなります。 – kleptocrat

+0

私の記事を明確にしました。 – Eelke

+0

私は私の問題を解決するのに役立ったので、私はこの答えに投票しました。役に立たないメッセージは、実際には無視されたエラーの後に別のメッセージが続くためです。問題を特定するには、次のことをお勧めします。1.必要な情報のほとんどを提供するlog/development.logファイルを調べます(例:SQL要求、単純な ' puts')これが十分でない場合は、PostgreSQLデータベースのログを調べることができます(私はローカルPGサーバを使用していますが、Herokuでこれを実行できるかどうかはわかりません)。 – rchampourlier

関連する問題