2011-04-12 104 views
1

我正在研究基於rails的網站的模型,並創建了一個名爲ItemAttributes的模型類,它定義了一組特定項目的有效屬性。例如,「牀大小」是物品「牀」的屬性。我還創建了一個AttributeValue類,它爲屬性定義了有效值,如'king''queen''full'等。Heroku PostgreSQL遷移問題

我試圖在遷移時在heroku上填充PostgreSQL數據庫,但它會拋出這個而不起作用錯誤(遷移本地工作的SQLite的):

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 

這裏是我使用的遷移:

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

我嘗試在此遷移中刪除所有「創建」,並且順利完成。一旦我將一個創建添加到遷移中,同樣的錯誤將會返回。 – kleptocrat 2011-04-12 17:55:26

+1

Heroku開發人員悲傷的頭號原因是在本地使用SQLite。 PostgreSQL是免費的。下載它,安裝它,並停止使用SQLite。 – 2011-05-21 11:08:08

回答

1

當在同一交易出現了以前的錯誤中給出此錯誤。查找並解決該錯誤。如果您希望發生某些錯誤並且不想回滾完整事務,則可以使用保存點。

編輯,一些澄清

爲了澄清,我在那裏看到了錯誤的流量大約是如下情況:

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 

錯誤後,交易必須是rolledback和新一個在你可以繼續之前開始,或者你必須回滾到一個保存點。

它可能是你遇到了一些其他的情況,給出了這個錯誤,但也許你應該檢查PGDATA/pg_log中的日誌,以檢查你的引擎是否正在記錄一些錯誤導軌忽略。

如果這樣做沒有幫助,您可以嘗試創建遷移期間執行的所有實際查詢(而不是導軌代碼)的日誌。

+0

我不確定你的意思。我很確定在創建這些屬性值之前沒有錯誤。我已經減少了遷移到上面創建的第一個,並且仍然導致錯誤。如果我刪除所有創建,錯誤消失。 – kleptocrat 2011-04-12 17:54:23

+0

澄清我的帖子,希望它有幫助。 – Eelke 2011-04-13 08:54:20

+0

我投這個答案,因爲它幫助我解決了我的問題。無益的信息實際上是由於一個被忽略的錯誤,其次是另一個錯誤。爲了確定問題,我建議:1.查看你的log/development.log文件,它會給你所需要的大部分信息(比如SQL請求,甚至可以在你的遷移中插入一些跟蹤, puts'),如果這還不夠,你可能想看看你的PostgreSQL數據庫日誌(我使用本地PG服務器,但不知道你是否可以在Heroku上做到這一點)。 – rchampourlier 2012-01-06 14:00:38