2017-02-24 18 views
5

我正在將我的Rails項目轉換爲多租戶,並且我正在使用ApartmentPG :: InFailedSqlTransaction創建初始租戶

我跟着他們的自述和方向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:setup沒有問題。它隨後在公共架構中創建我的所有表。

但是,當我嘗試創建一個新的項目,我得到這個(從軌三)

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具有相似的堆棧跟蹤,但解決方法沒有道理給我。

我使用: 紅寶石2.3.1(2016年4月26日PATCHLEVEL 112)[x64的的mingw32] 公寓1.2.0 滑軌5.0.1

+0

嘗試從租戶遷移中除去一個表,以縮小問題的範圍。這可能是一個不好的遷移。從ActiveRecord :: StatementInvalid錯誤中,這意味着其中一個SQL語句無效。 – Troy

回答

0

如果該日誌將被信任,它似乎失敗:

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中的一個新系統表。

+0

啊!我沒有意識到一個是新的。所以當我不使用公寓時,它會被創造得很好。但它似乎公寓未能創建它?我會去跟他們提交一個錯誤並確認。如果這是我的問題,我會回來並授予您。 – Andy

+0

沒有任何關於[我的問題]的公寓人員的話(https://github.com/influitive/apartment/issues/404),但它看起來像他們知道ar_internal_metadata與[此提交](https:// github .com/influitive/apartment/commit/bd3f56de3d5842ba333fa82f2dab9e65b7ec5592) – Andy

+0

我是公寓民間! :)新的租戶從你的db/schema.rb創建,這個表是在那裏定義的嗎?當你不使用公寓並且它正在工作時,你是如何創建的?編輯:nvm我忘記了導軌如何瞬間工作。我會着眼於它。 –