【问题标题】:PG::InFailedSqlTransaction on creating initial tenantPG::InFailedSqlTransaction 创建初始租户
【发布时间】:2017-02-24 18:10:51
【问题描述】:

我正在将我的 Rails 项目转换为多租户,我正在使用 Apartment

我按照他们的自述文件和the video they link to 中的说明进行操作

我的apartment.rb 看起来像这样:

require 'apartment/elevators/subdomain'
Apartment.configure do |config|
  config.excluded_models = ['Project', 'User']
  config.tenant_names = lambda { Project.pluck :subdomain }
  config.use_schemas = true
  config.persistent_schemas = %w{ public }
end
Rails.application.config.middleware.use Apartment::Elevators::Subdomain

我的项目模型如下所示:

class Project < ApplicationRecord
  after_create :create_tenant

  private

  def create_tenant
    Apartment::Tenant.create(subdomain)
  end
end

我可以运行 db:migrate 和 db:setup 没问题。然后它会在公共架构中创建我的所有表。

但是,当我尝试创建一个新项目时,我得到了这个(来自 rails c)

C:\code\vulnerability-history>rails c
Loading development environment (Rails 5.0.1)
irb(main):001:0> Project.create(name: 'foo', subdomain: 'bar')
   (0.0ms)  BEGIN
  SQL (1.0ms)  INSERT INTO "public"."projects" ("name", "subdomain") VALUES ($1, $2) RETURNING "id"  [["name", "foo"], ["subdomain", "bar"]]
   (1.0ms)  CREATE SCHEMA "bar"
  SQL (1.0ms)  CREATE EXTENSION IF NOT EXISTS "plpgsql"
   (2.0ms)  DROP TABLE "commit_filepaths" CASCADE
   (14.0ms)  CREATE TABLE "commit_filepaths" ("id" serial primary key, "commit_id" integer NOT NULL, "filepath_id" integer NOT NULL, "total_churn" integer DEFAULT 0 NOT NULL)
   (1.0ms)  DROP TABLE "commits" CASCADE
   (11.0ms)  CREATE TABLE "commits" ("id" serial primary key, "commit_hash" character varying NOT NULL, "author_id" integer NOT NULL, "message" character varying NOT NULL, "date_created" timestamp NOT NULL, "notes" jsonb DEFAULT '{}' NOT NULL)
   (1.0ms)  DROP TABLE "developers" CASCADE
   (11.0ms)  CREATE TABLE "developers" ("id" serial primary key, "email" character varying NOT NULL)
   (1.5ms)  DROP TABLE "events" CASCADE
   (9.4ms)  CREATE TABLE "events" ("id" serial primary key, "detail_type" character varying NOT NULL, "detail_id" integer NOT NULL, "title_template" character varying DEFAULT ':title:' NOT NULL, "description_template" character varying DEFAULT ':description:' NOT NULL, "type_template" character varying DEFAULT ':type:' NOT NULL, "date_template" character varying DEFAULT ':date:' NOT NULL, "style_id" integer NOT NULL)
   (1.0ms)  DROP TABLE "filepaths" CASCADE
   (11.0ms)  CREATE TABLE "filepaths" ("id" serial primary key, "filepath" character varying NOT NULL, "notes" jsonb DEFAULT '{}' NOT NULL)
   (1.0ms)  DROP TABLE "fixes" CASCADE
   (11.0ms)  CREATE TABLE "fixes" ("id" serial primary key, "commit_id" integer NOT NULL, "vulnerability_id" integer NOT NULL, "notes" jsonb DEFAULT '{}' NOT NULL)
   (1.0ms)  DROP TABLE "projects" CASCADE
   (13.0ms)  CREATE TABLE "projects" ("id" serial primary key, "name" character varying NOT NULL, "subdomain" character varying NOT NULL)
   (1.0ms)  DROP TABLE "releases" CASCADE
   (10.6ms)  CREATE TABLE "releases" ("id" serial primary key, "number" integer NOT NULL, "date_released" timestamp NOT NULL, "project" character varying NOT NULL, "notes" jsonb NOT NULL)
   (1.0ms)  DROP TABLE "styles" CASCADE
   (11.3ms)  CREATE TABLE "styles" ("id" serial primary key, "name" character varying NOT NULL, "color" character varying DEFAULT '#ffffff' NOT NULL, "icon" character varying DEFAULT 'stars' NOT NULL)
   (1.0ms)  DROP TABLE "users" CASCADE
   (11.4ms)  CREATE TABLE "users" ("id" serial primary key, "username" character varying NOT NULL)
   (1.0ms)  DROP TABLE "vccs" CASCADE
   (10.0ms)  CREATE TABLE "vccs" ("id" serial primary key, "commit_id" integer NOT NULL, "vulnerability_id" integer NOT NULL, "notes" jsonb DEFAULT '{}' NOT NULL)
   (1.0ms)  DROP TABLE "vulnerabilities" CASCADE
   (12.3ms)  CREATE TABLE "vulnerabilities" ("id" serial primary key, "cve" character varying NOT NULL, "announced" timestamp NOT NULL, "description" character varying DEFAULT '' NOT NULL, "notes" jsonb DEFAULT '{}' NOT NULL)
   (1.0ms)  SELECT version FROM "schema_migrations"
  ActiveRecord::InternalMetadata Load (1.0ms)  SELECT  "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2  [["key", :environment], ["LIMIT", 1]]
   (0.0ms)  ROLLBACK
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR:  current transaction is aborted, commands ignored until end of transaction block
: SET search_path TO "public", "public"
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `async_exec'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `block in execute'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract_adapter.rb:589:in `block in log'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract_adapter.rb:583:in `log'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:97:in `execute'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/connection_adapters/postgresql/schema_statements.rb:315:in `schema_search_path='
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/apartment-1.2.0/lib/apartment/adapters/postgresql_adapter.rb:40:in `reset'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/apartment-1.2.0/lib/apartment/adapters/abstract_adapter.rb:109:in `rescue in ensure in switch'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/apartment-1.2.0/lib/apartment/adapters/abstract_adapter.rb:109:in `ensure in switch'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/apartment-1.2.0/lib/apartment/adapters/abstract_adapter.rb:109:in `switch'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/apartment-1.2.0/lib/apartment/adapters/abstract_adapter.rb:26:in `block in create'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/callbacks.rb:97:in `__run_callbacks__'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/callbacks.rb:750:in `_run_create_callbacks'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/callbacks.rb:90:in `run_callbacks'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/apartment-1.2.0/lib/apartment/adapters/abstract_adapter.rb:23:in `create'
... 22 levels...
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `transaction'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/transactions.rb:211:in `transaction'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/transactions.rb:319:in `block in save'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/transactions.rb:334:in `rollback_active_record_state!'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/transactions.rb:318:in `save'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/suppressor.rb:41:in `save'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/persistence.rb:34:in `create'
        from (irb):1
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-5.0.1/lib/rails/commands/console.rb:65:in `start'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-5.0.1/lib/rails/commands/console_helper.rb:9:in `start'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:78:in `console'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
        from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-5.0.1/lib/rails/commands.rb:18:in `<top (required)>'
        from bin/rails:4:in `require'
        from bin/rails:4:in `<main>'

我确实注意到 this issue 有类似的堆栈跟踪,但解决方法对我来说没有意义。

我正在使用: Ruby 2.3.1 (2016-04-26 补丁级别 112) [x64-mingw32] 公寓 1.2.0 导轨 5.0.1

【问题讨论】:

  • 尝试从租户迁移中删除除一个表之外的所有表以缩小问题范围。这可能是一次糟糕的迁移。从 ActiveRecord::StatementInvalid 错误看,其中一条 SQL 语句无效。

标签: ruby-on-rails apartment-gem


【解决方案1】:

如果日志是可信的,它似乎失败了:

SELECT  "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2  [["key", :environment], ["LIMIT", 1]]

您的 db/schema.rb 是否包含此表?这是 Rails 5 中的一个新系统表。

【讨论】:

  • 啊!我没有意识到这是一个新的。所以当我不使用公寓时,它会被创建得很好。但似乎公寓未能创建它?我会向他们提交一个错误并确认。如果这是问题,我会回来奖励你。
  • my issue 上还没有来自 Apartment 人员的消息,但看起来他们知道 this commit 上的 ar_internal_metadata
  • 我是公寓的人! :) 新租户是从您的 db/schema.rb 创建的,该表是否在那里定义?当你不使用公寓并且它正在工作时,你是如何创造的?编辑:nvm 我暂时忘记了 rails 是如何工作的。我会调查的。
  • 太棒了!感谢您为此工作。因此,如果没有公寓,我确实会创建 ar_internal_metadata。安装了公寓并仅执行 rails db:setup 后,我从 schema.rb 中获取了所有表,包括 ar_internal_metadata。 (顺便说一句,我在 GitHub 上的代码是 here in the issue-121 branch,以防你需要它
猜你喜欢
  • 2014-02-03
  • 2018-03-08
  • 2014-01-11
  • 2014-02-11
  • 1970-01-01
  • 2021-03-11
  • 2018-06-15
  • 2014-09-24
  • 1970-01-01
相关资源
最近更新 更多