2013-04-26 3 views
2

Я работаю через mutli-tenancy tut, используя схемы postgres.Rails: Очистка схем postgres в базе данных тестов

Схемы для каждого арендатора в тестовой базе данных должны быть очищены после каждого запуска для правильной работы тестов.

RSpec производит следующие ошибки

An error occurred in an after hook 
    PG::Error: ERROR: syntax error at or near "where" 
LINE 5:  where nspowner != (select oid from pg_roles where role... 


1) account scoping displays only account A's records 
    Failure/Error: let!(:account_a) { FactoryGirl.create(:account_with_schema) } 
    Apartment::SchemaExists: 
    The schema test1 already exists. 
    # ./app/models/subscribem/account.rb:20:in `create_schema' 
    # ./spec/support/factories/account_factory.rb:11:in `block (4 levels) in <top (required)>' 
    # ./spec/features/accounts/scoping_spec.rb:4:in `block (2 levels) in <top (required)>' 

Это код пытается очистить базу данных после каждого теста.

spec_helper.rb

config.after(:each) do 
    Apartment::Database.reset 
    DatabaseCleaner.clean 
    connection = ActiveRecord::Base.connection.raw_connection 
    schema = connection.query(%Q{ 
    SELECT 'drop schema ' || nspname || ' cascade;' 
    from pg_namespace 
    where nspname != 'public' AND 
    where nspowner != (select oid from pg_roles where rolname = 'postgres'); 
    }) 
    schemas.each do |query| 
    connection.query(query.values.first) 
    end 
end 

ответ

1

Похоже, есть несколько вещей, которые не так с вашей SQL.

Во-первых, у вас есть две статьи WHERE, просто используйте AND вместо AND WHERE. Во-вторых, вам, вероятно, нужно использовать NOT IN, а не != для вашего условия подзапроса.

Try:

schema = connection.query(%Q{ 
    SELECT 'drop schema ' || nspname || ' cascade;' 
    from pg_namespace 
    where nspname != 'public' AND 
    nspowner NOT IN (select oid from pg_roles where rolname = 'postgres'); 
}) 
+0

Тем не менее производит ту же ошибку, произошла ошибка в после крюком PG :: Error: ERROR: ошибка синтаксиса в или вблизи "где" ЛИНИЯ 5: где nspowner NOT IN (выберите oid из pg_roles, где ... –

+0

Похоже, что у него все еще есть два предложения WHERE, строка 5, упомянутая в ошибке, должна быть 'nspowner NOT IN ...' not 'где nspowner NOT IN'. – Steve

Смежные вопросы