2

我使用 postgres 模式通过多租户 tut 工作。

每次运行后都需要清除测试数据库中每个租户的模式,以便测试正确运行。

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
4

1 回答 1

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'); 
})
于 2013-04-26T14:06:59.517 回答