Spec-Zone.ru › Ruby on Rails 4.1

module ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::SchemaStatements

Публичные методы экземпляра

add_column(table_name, column_name, type, options = {}) Show source

Добавляет новый столбец в указанную таблицу. См. ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::TableDefinition#column для подробного описания параметров, которые можно использовать.

Вызывает метод суперкласса
# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 396
def add_column(table_name, column_name, type, options = {})
  clear_cache!
  super
end
change_column(table_name, column_name, type, options = {}) Show source

Изменяет столбец таблицы.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 402
def change_column(table_name, column_name, type, options = {})
  clear_cache!
  quoted_table_name = quote_table_name(table_name)
  sql_type = type_to_sql(type, options[:limit], options[:precision], options[:scale])
  sql_type << "[]" if options[:array]
  execute "ALTER TABLE #{quoted_table_name} ALTER COLUMN #{quote_column_name(column_name)} TYPE #{sql_type}"

  change_column_default(table_name, column_name, options[:default]) if options_include_default?(options)
  change_column_null(table_name, column_name, options[:null], options[:default]) if options.key?(:null)
end
change_column_default(table_name, column_name, default) Show source

Изменяет значение по умолчанию столбца таблицы.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 414
def change_column_default(table_name, column_name, default)
  clear_cache!
  column = column_for(table_name, column_name)

  execute "ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN #{quote_column_name(column_name)} SET DEFAULT #{quote_default_value(default, column)}" if column
end
change_column_null(table_name, column_name, null, default = nil) Show source
# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 421
def change_column_null(table_name, column_name, null, default = nil)
  clear_cache!
  unless null || default.nil?
    column = column_for(table_name, column_name)
    execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote_default_value(default, column)} WHERE #{quote_column_name(column_name)} IS NULL") if column
  end
  execute("ALTER TABLE #{quote_table_name(table_name)} ALTER #{quote_column_name(column_name)} #{null ? 'DROP' : 'SET'} NOT NULL")
end
client_min_messages() Show source

Возвращает текущий уровень сообщений клиента.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 268
def client_min_messages
  query('SHOW client_min_messages', 'SCHEMA')[0][0]
end
client_min_messages=(level) Show source

Устанавливает уровень сообщений клиента.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 273
def client_min_messages=(level)
  execute("SET client_min_messages TO '#{level}'", 'SCHEMA')
end
collation() Show source

Возвращает текущую сортировку базы данных.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 216
        def collation
          query("            SELECT pg_database.datcollate FROM pg_database WHERE pg_database.datname LIKE '#{current_database}'
", 'SCHEMA')[0][0]
        end
columns(table_name) Show source

Возвращает список всех определений столбцов для таблицы.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 185
def columns(table_name)
  # Limit, precision, and scale are all handled by the superclass.
  column_definitions(table_name).map do |column_name, type, default, notnull, oid, fmod|
    oid = get_oid_type(oid.to_i, fmod.to_i, column_name)
    PostgreSQLColumn.new(column_name, default, oid, type, notnull == 'f')
  end
end
create_database(name, options = {}) Show source

Создает новую базу данных PostgreSQL. Параметры включают :owner, :template, :encoding (по умолчанию utf8), :collation, :ctype, :tablespace, и :connection_limit (обратите внимание, что MySQL использует :charset, а PostgreSQL использует :encoding).

Пример:

create_database config[:database], config
create_database 'foo_development', encoding: 'unicode'
# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 56
def create_database(name, options = {})
  options = { encoding: 'utf8' }.merge!(options.symbolize_keys)

  option_string = options.inject("") do |memo, (key, value)|
    memo += case key
    when :owner
      " OWNER = \"#{value}\""
    when :template
      " TEMPLATE = \"#{value}\""
    when :encoding
      " ENCODING = '#{value}'"
    when :collation
      " LC_COLLATE = '#{value}'"
    when :ctype
      " LC_CTYPE = '#{value}'"
    when :tablespace
      " TABLESPACE = \"#{value}\""
    when :connection_limit
      " CONNECTION LIMIT = #{value}"
    else
      ""
    end
  end

  execute "CREATE DATABASE #{quote_table_name(name)}#{option_string}"
end
create_schema(schema_name) Show source

Создает схему для указанного имени схемы.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 241
def create_schema schema_name
  execute "CREATE SCHEMA #{schema_name}"
end
ctype() Show source

Возвращает текущий тип данных базы данных.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 223
        def ctype
          query("            SELECT pg_database.datctype FROM pg_database WHERE pg_database.datname LIKE '#{current_database}'
", 'SCHEMA')[0][0]
        end
current_database() Show source

Возвращает текущее имя базы данных.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 198
def current_database
  query('select current_database()', 'SCHEMA')[0][0]
end
current_schema() Show source

Возвращает текущее имя схемы.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 203
def current_schema
  query('SELECT current_schema', 'SCHEMA')[0][0]
end
drop_schema(schema_name) Show source

Удаляет схему для указанного имени схемы.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 246
def drop_schema schema_name
  execute "DROP SCHEMA #{schema_name} CASCADE"
end
encoding() Show source

Возвращает текущий формат кодировки базы данных.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 208
        def encoding
          query("            SELECT pg_encoding_to_char(pg_database.encoding) FROM pg_database
            WHERE pg_database.datname LIKE '#{current_database}'
", 'SCHEMA')[0][0]
        end
index_name_exists?(table_name, index_name, default) Show source
# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 129
        def index_name_exists?(table_name, index_name, default)
          exec_query("            SELECT COUNT(*)
            FROM pg_class t
            INNER JOIN pg_index d ON t.oid = d.indrelid
            INNER JOIN pg_class i ON d.indexrelid = i.oid
            WHERE i.relkind = 'i'
              AND i.relname = '#{index_name}'
              AND t.relname = '#{table_name}'
              AND i.relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname = ANY (current_schemas(false)) )
", 'SCHEMA').rows.first[0].to_i > 0
        end
index_name_length() Show source
# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 450
def index_name_length
  63
end
indexes(table_name, name = nil) Show source

Возвращает массив индексов для указанной таблицы.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 143
        def indexes(table_name, name = nil)
           result = query("             SELECT distinct i.relname, d.indisunique, d.indkey, pg_get_indexdef(d.indexrelid), t.oid
             FROM pg_class t
             INNER JOIN pg_index d ON t.oid = d.indrelid
             INNER JOIN pg_class i ON d.indexrelid = i.oid
             WHERE i.relkind = 'i'
               AND d.indisprimary = 'f'
               AND t.relname = '#{table_name}'
               AND i.relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname = ANY (current_schemas(false)) )
            ORDER BY i.relname
", 'SCHEMA')

          result.map do |row|
            index_name = row[0]
            unique = row[1] == 't'
            indkey = row[2].split(" ")
            inddef = row[3]
            oid = row[4]

            columns = Hash[query("            SELECT a.attnum, a.attname
            FROM pg_attribute a
            WHERE a.attrelid = #{oid}
            AND a.attnum IN (#{indkey.join(",")})
", "SCHEMA")]

            column_names = columns.values_at(*indkey).compact

            unless column_names.empty?
              # add info on sort order for columns (only desc order is explicitly specified, asc is the default)
              desc_order_columns = inddef.scan(/(\w+) DESC/).flatten
              orders = desc_order_columns.any? ? Hash[desc_order_columns.map {|order_column| [order_column, :desc]}] : {}
              where = inddef.scan(/WHERE (.+)$/).flatten[0]
              using = inddef.scan(/USING (.+?) /).flatten[0].to_sym

              IndexDefinition.new(table_name, index_name, unique, column_names, [], orders, where, nil, using)
            end
          end.compact
        end
primary_key(table) Show source

Возвращает только первичный ключ таблицы

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 361
        def primary_key(table)
          row = exec_query("            SELECT attr.attname
            FROM pg_attribute attr
            INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = cons.conkey[1]
            WHERE cons.contype = 'p'
              AND cons.conrelid = '#{quote_table_name(table)}'::regclass
", 'SCHEMA').rows.first

          row && row.first
        end
rename_column(table_name, column_name, new_column_name) Show source

Переименовывает столбец в таблице.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 431
def rename_column(table_name, column_name, new_column_name)
  clear_cache!
  execute "ALTER TABLE #{quote_table_name(table_name)} RENAME COLUMN #{quote_column_name(column_name)} TO #{quote_column_name(new_column_name)}"
  rename_column_indexes(table_name, column_name, new_column_name)
end
rename_index(table_name, old_name, new_name) Show source
# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 446
def rename_index(table_name, old_name, new_name)
  execute "ALTER INDEX #{quote_column_name(old_name)} RENAME TO #{quote_table_name(new_name)}"
end
rename_table(table_name, new_name) Show source

Переименовывает таблицу. Также переименовывает последовательность первичного ключа таблицы, если имя последовательности совпадает с именем по умолчанию Active Record.

Пример:

rename_table('octopuses', 'octopi')
# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 379
def rename_table(table_name, new_name)
  clear_cache!
  execute "ALTER TABLE #{quote_table_name(table_name)} RENAME TO #{quote_table_name(new_name)}"
  pk, seq = pk_and_sequence_for(new_name)
  if seq == "#{table_name}_#{pk}_seq"
    new_seq = "#{new_name}_#{pk}_seq"
    idx = "#{table_name}_pkey"
    new_idx = "#{new_name}_pkey"
    execute "ALTER TABLE #{quote_table_name(seq)} RENAME TO #{quote_table_name(new_seq)}"
    execute "ALTER INDEX #{quote_table_name(idx)} RENAME TO #{quote_table_name(new_idx)}"
  end

  rename_table_indexes(table_name, new_name)
end
schema_exists?(name) Show source

Возвращает true, если схема существует.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 121
        def schema_exists?(name)
          exec_query("            SELECT COUNT(*)
            FROM pg_namespace
            WHERE nspname = '#{name}'
", 'SCHEMA').rows.first[0].to_i > 0
        end
schema_names() Show source

Возвращает массив имен схем.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 230
        def schema_names
          query("            SELECT nspname
              FROM pg_namespace
             WHERE nspname !~ '^pg_.*'
               AND nspname NOT IN ('information_schema')
             ORDER by nspname;
", 'SCHEMA').flatten
        end
schema_search_path() Show source

Возвращает активный путь поиска схемы.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 263
def schema_search_path
  @schema_search_path ||= query('SHOW search_path', 'SCHEMA')[0][0]
end
schema_search_path=(schema_csv) Показать исходный код

Устанавливает путь поиска схем в строку с именами схем, разделёнными запятыми. Имена, начинающиеся с $, должны быть заключены в кавычки (например, $user => '$user'). См.: www.postgresql.org/docs/current/static/ddl-schemas.html

Этот метод не должен вызываться вручную, но должен быть задан в файле database.yml.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 255
def schema_search_path=(schema_csv)
  if schema_csv
    execute("SET search_path TO #{schema_csv}", 'SCHEMA')
    @schema_search_path = schema_csv
  end
end
serial_sequence(table, column) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 286
        def serial_sequence(table, column)
          result = exec_query("            SELECT pg_get_serial_sequence('#{table}', '#{column}')
", 'SCHEMA')
          result.rows.first.first
        end
table_exists?(name) Показать исходный код

Возвращает true, если таблица существует. Если схема не указана в name, то будут найдены только таблицы в текущем пути поиска схем (независимо от разрешений на доступ к таблицам в других схемах)

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 103
        def table_exists?(name)
          schema, table = Utils.extract_schema_and_table(name.to_s)
          return false unless table

          binds = [[nil, table]]
          binds << [nil, schema] if schema

          exec_query("              SELECT COUNT(*)
              FROM pg_class c
              LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
              WHERE c.relkind in ('v','r')
              AND c.relname = '#{table.gsub(/(^"|"$)/,'')}'
              AND n.nspname = #{schema ? "'#{schema}'" : 'ANY (current_schemas(false))'}
", 'SCHEMA').rows.first[0].to_i > 0
        end
tables(name = nil) Показать исходный код

Возвращает список всех таблиц в пути поиска схем или в указанной схеме.

# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 92
        def tables(name = nil)
          query("            SELECT tablename
            FROM pg_tables
            WHERE schemaname = ANY (current_schemas(false))
", 'SCHEMA').map { |row| row[0] }
        end
type_to_sql(type, limit = nil, precision = nil, scale = nil) Показать исходный код

Преобразует логические типы Rails в специфические для PostgreSQL типы данных.

Вызов метода суперкласса
# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 455
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
  case type.to_s
  when 'binary'
    # PostgreSQL doesn't support limits on binary (bytea) columns.
    # The hard limit is 1Gb, because of a 32-bit size field, and TOAST.
    case limit
    when nil, 0..0x3fffffff; super(type)
    else raise(ActiveRecordError, "No binary type has byte size #{limit}.")
    end
  when 'text'
    # PostgreSQL doesn't support limits on text columns.
    # The hard limit is 1Gb, according to section 8.3 in the manual.
    case limit
    when nil, 0..0x3fffffff; super(type)
    else raise(ActiveRecordError, "The limit on text can be at most 1GB - 1byte.")
    end
  when 'integer'
    return 'integer' unless limit

    case limit
      when 1, 2; 'smallint'
      when 3, 4; 'integer'
      when 5..8; 'bigint'
      else raise(ActiveRecordError, "No integer type has byte size #{limit}. Use a numeric with precision 0 instead.")
    end
  when 'datetime'
    return super unless precision

    case precision
      when 0..6; "timestamp(#{precision})"
      else raise(ActiveRecordError, "No timestamp type has precision of #{precision}. The allowed range of precision is from 0 to 6")
    end
  else
    super
  end
end

© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API