首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在rails迁移过程中捕获SQL错误-以便以静默方式失败

在rails迁移过程中捕获SQL错误-以便以静默方式失败
EN

Stack Overflow用户
提问于 2014-07-31 17:50:27
回答 1查看 1K关注 0票数 1

我正在尝试在运行rails迁移(rake db:migrate)时捕获错误,以便它可以静默失败。

我想在我的PostgreSQL数据库上启用RDKit扩展,但前提是它在PostgreSQL安装中可用。我的rescue代码正在运行,但是rake仍然中止。我试过这个:

代码语言:javascript
运行
复制
class EnableExtensionRdkit < ActiveRecord::Migration
  def up
    begin
      ActiveRecord::Base.connection.execute("CREATE EXTENSION rdkit;")
    rescue => error
      p "NO RDKit SUPPORT due to exception: "+error.to_s
  end
  def down
    ActiveRecord::Base.connection.execute("DROP EXTENSION IF EXISTS rdkit;")
  end
end

但是我得到了这个错误:

代码语言:javascript
运行
复制
$ rake db:migrate
==  EnableExtensionRdkit: migrating ===========================================
NO RDKit SUPPORT due to exception: PG::UndefinedFile: ERROR:  could not access file "$libdir/rdkit": No such file or directory
: CREATE EXTENSION rdkit;
==  EnableExtensionRdkit: migrated (0.0955s) ==================================

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::InFailedSqlTransaction: ERROR:  current transaction is aborted, commands ignored until end of transaction block
:             SELECT attr.attname
            FROM pg_attribute attr
            INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = cons.conkey[1]
            WHERE cons.contype = 'p'
              AND cons.conrelid = '"schema_migrations"'::regclass
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.1/lib/active_record/connection_adapters/postgresql_adapter.rb:774:in `async_exec'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.1/lib/active_record/connection_adapters/postgresql_adapter.rb:774:in `exec_no_cache'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:138:in `block in exec_query'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.1/lib/active_record/connection_adapters/abstract_adapter.rb:435:in `block in log'
/Library/Ruby/Gems/2.0.0/gems/activesupport-4.0.1/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.1/lib/active_record/connection_adapters/abstract_adapter.rb:430:in `log'
EN

回答 1

Stack Overflow用户

发布于 2014-07-31 18:18:56

我找到了一种让它停止失败的方法。我怀疑关键字可能是“事务”。因此,我在上面的EnableExtensionRdkit类中添加了disable_ddl_transaction!()。这解决了问题,并给我留下了所需的输出:

代码语言:javascript
运行
复制
$ rake db:migrate
==  EnableExtensionRdkit: migrating ===========================================
NO RDKit SUPPORT due to exception: PG::UndefinedFile: ERROR:  could not access file "$libdir/rdkit": No such file or directory
: CREATE EXTENSION rdkit;
==  EnableExtensionRdkit: migrated (0.0875s) ==================================

希望有人能用上这个!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25055818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档