Rails:清除测试数据库中的postgres模式

时间:2013-04-26 10:33:26

标签: ruby-on-rails postgresql rspec multi-tenant

我使用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 个答案:

答案 0 :(得分:1)

看起来您的SQL存在一些问题。

首先,您有两个WHERE条款,只需使用AND代替AND WHERE。其次,您可能需要使用NOT IN而不是!=作为子查询条件。

尝试:

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'); 
})