2011-04-12 132 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