ebeigarts / database_flusher

tiny and fast database cleaner

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Add schema support

ronwsmith opened this issue · comments

Seems that there isn't any schema support at the moment. When attempting to clean post-spec, schema name is not included with the table name and it throws an ActiveRecord error:

ActiveRecord::StatementInvalid:
       PG::UndefinedTable: ERROR:  relation "<table name>" does not exist

I think only public schema is supported for now. Did INSERT queries have schema prefixes? Can you give me a sample INSERT statement?

Yes, they do have schema prefixes. Here is a sample:

INSERT INTO "<schema name>"."<table name>" ("<column name>", "created_at")
VALUES ($1, $2) RETURNING "<column name>"  
[["<column name>", "<column value>"], ["created_at", "2017-02-27T15:51:09.178Z"]]

To be more clear on where the error is occurring -- it's in the after :each block when attempting DatabaseFlusher.clean. Here is the backtrace:

Failures:

  1) <scenario name>
     Failure/Error: DatabaseFlusher.clean

     ActiveRecord::StatementInvalid:
       PG::UndefinedTable: ERROR:  relation "<table name>" does not exist
       : ALTER TABLE "<table name>" ENABLE TRIGGER ALL
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `async_exec'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `block in execute'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract_adapter.rb:566:in `block in log'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract_adapter.rb:560:in `log'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:97:in `execute'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/database_flusher-0.3.2/lib/database_flusher/active_record/adapters/abstract_adapter.rb:29:in `execute'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/database_flusher-0.3.2/lib/database_flusher/active_record/adapters/postgresql_adapter.rb:11:in `ensure in disable_referential_integrity'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/database_flusher-0.3.2/lib/database_flusher/active_record/adapters/postgresql_adapter.rb:11:in `disable_referential_integrity'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/database_flusher-0.3.2/lib/database_flusher/active_record/adapters/abstract_adapter.rb:13:in `delete'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/database_flusher-0.3.2/lib/database_flusher/active_record/deletion_strategy.rb:50:in `clean'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/database_flusher-0.3.2/lib/database_flusher/cleaner.rb:37:in `clean'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/database_flusher-0.3.2/lib/database_flusher.rb:32:in `each'
     # /usr/local/var/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/database_flusher-0.3.2/lib/database_flusher.rb:32:in `clean'
     # ./spec/rails_helper.rb:86:in `block (2 levels) in <top (required)>'

This regexp needs to be improved to support schemas, don't have time right now to add the support for schemas.

If you know the schemas for the table names, you can do something like this as a workaround

tables = DatabaseFlusher[:active_record].strategy.tables
tables.each do |table|
  if table == "mytable"
    tables.delete table
    tables.add "myschema.#{table}"
  end
end
DatabaseFlusher[:active_record].clean

Anyway pull requests are welcome, let me know if you are up to it.

@ebeigarts Just created PR #2. Let me know what you think. I think the failing test can just be modified to allow the new format but let me know if you can think of any ill side effects to consider.

@ronwsmith did manage to get time for this, can you try #3?

@ebeigarts I no longer receive any errors with #3 and individual specs work fine, but my CI runs are timing out when running the full suite. Won't have time to debug for a couple weeks and it's likely a different issue. #3 should be fine to merge and I'll open a new issue once I can figure out what's causing the timeouts. Thanks!