Module: PgSaurus::ConnectionAdapters::PostgreSQLAdapter::SchemaMethods

Included in:
PgSaurus::ConnectionAdapters::PostgreSQLAdapter
Defined in:
lib/pg_saurus/connection_adapters/postgresql_adapter/schema_methods.rb

Overview

Provides methods to extend ActiveRecord::ConnectionAdapters::PostgreSQLAdapter to support schemas feature.

Instance Method Summary collapse

Instance Method Details

#create_schema_if_not_exists(schema_name) ⇒ Object

Create schema if it does not exist yet.

Parameters:

  • schema_name (String)


14
15
16
# File 'lib/pg_saurus/connection_adapters/postgresql_adapter/schema_methods.rb', line 14

def create_schema_if_not_exists(schema_name)
  ::PgSaurus::Tools.create_schema_if_not_exists(schema_name)
end

#current_schema_search_pathObject

Reads the current schema search path (it may have been altered from the initial value used when creating the connection)



80
81
82
# File 'lib/pg_saurus/connection_adapters/postgresql_adapter/schema_methods.rb', line 80

def current_schema_search_path
  select_value("SHOW search_path;")
end

#drop_schema_if_exists(schema_name) ⇒ Object

Drop schema if it exists.

Parameters:

  • schema_name (String)


21
22
23
# File 'lib/pg_saurus/connection_adapters/postgresql_adapter/schema_methods.rb', line 21

def drop_schema_if_exists(schema_name)
  ::PgSaurus::Tools.drop_schema_if_exists(schema_name)
end

#drop_table(table_name, options = {}) ⇒ Object

Provide :schema option to drop_table method.



26
27
28
29
30
31
# File 'lib/pg_saurus/connection_adapters/postgresql_adapter/schema_methods.rb', line 26

def drop_table(table_name, options = {})
  options     = options.dup
  schema_name = options.delete(:schema)
  table_name  = "#{schema_name}.#{table_name}" if schema_name
  super(table_name, **options)
end

#in_schema(schema_name) ⇒ Object

Execute operations in the context of the schema



68
69
70
71
72
73
74
75
76
# File 'lib/pg_saurus/connection_adapters/postgresql_adapter/schema_methods.rb', line 68

def in_schema(schema_name)
  search_path = current_schema_search_path
  begin
    execute("SET search_path TO '%s'" % schema_name)
    yield
  ensure
    execute("SET search_path TO #{search_path};")
  end
end

#move_table_to_schema(table, schema) ⇒ Object

Move table to another schema

Parameters:

  • table (String)

    table name. Can be with schema prefix e.g. “demography.people”

  • schema (String)

    schema where table should be moved to.



7
8
9
# File 'lib/pg_saurus/connection_adapters/postgresql_adapter/schema_methods.rb', line 7

def move_table_to_schema(table, schema)
  ::PgSaurus::Tools.move_table_to_schema(table, schema)
end

#rename_table(table_name, new_name, options = {}) ⇒ Object

Provide :schema option to rename_table method.



56
57
58
59
60
61
62
63
64
65
# File 'lib/pg_saurus/connection_adapters/postgresql_adapter/schema_methods.rb', line 56

def rename_table(table_name, new_name, options = {})
  schema_name = options[:schema]
  if schema_name
    in_schema schema_name do
      super(table_name, new_name)
    end
  else
    super(table_name, new_name)
  end
end

#tables(*args) ⇒ Array<String>

Note:

Tables from public schema have no “public.” prefix. It’s done for compatibility with other libraries that relies on a table name. Tables from other schemas has appropriate prefix with schema name. See: github.com/TMXCredit/pg_power/pull/42

Make method tables return tables not only from public schema.

Returns:

  • (Array<String>)

    table names



42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/pg_saurus/connection_adapters/postgresql_adapter/schema_methods.rb', line 42

def tables(*args)
  public_tables = super(*args)

  non_public_tables =
    query(<<-SQL, 'SCHEMA').map { |row| row[0] }
      SELECT schemaname || '.' || tablename AS table
      FROM pg_tables
      WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'public')
    SQL

  public_tables + non_public_tables
end