ActiveRecord: список столбцов в таблице из консоли


112

Я знаю, что вы можете попросить ActiveRecord отобразить таблицы в консоли, используя:

ActiveRecord::Base.connection.tables

Есть ли команда, которая перечислила бы столбцы в данной таблице?

Ответы:


213

Это перечислит имена столбцов из таблицы

Model.column_names
e.g. User.column_names

16
Вы также можете запустить что-то вроде, Model.columnsчтобы получить больше информации о столбцах, включая данные конфигурации базы данных.
srt32

1
Большой! Использование Model.columnsпредоставляет всю информацию для таблицы через ActiveRecord. Для меня это был единственный и самый простой способ получить уверенность в том, что на самом деле был мой первичный ключ на уровне базы данных.
nibbex

2
Вы всегда можете использовать Model.primary_key, который дает вам имя первичного ключа в соответствии с рельсами. (Это будет id, если он не объявлен в модели как что-то еще).
AJFaraday

57

Он получает столбцы, а не только имена столбцов, и использует ActiveRecord :: Base :: Connection, поэтому никаких моделей не требуется. Удобно для быстрого вывода структуры базы данных.

ActiveRecord::Base.connection.tables.each do |table_name|
  puts table_name
  ActiveRecord::Base.connection.columns(table_name).each do |c| 
    puts "- #{c.name}: #{c.type} #{c.limit}"
  end
end

Пример вывода: http://screencast.com/t/EsNlvJEqM


В rails 3.2 это как-то primaryнеправильно устанавливает атрибут (у всех столбцов primary=nil). Он установлен правильно Model.columnsметодом, предложенным srt32.
sayap

1
Это правильный ответ. Модель не требуется. Не для каждой таблицы есть модель. "has_many_and_belongs_to"
baash05

22

Используя рельсы три, вы можете просто ввести название модели:

> User
gives:
User(id: integer, name: string, email: string, etc...)

В рельсах четыре вам нужно сначала установить соединение:

irb(main):001:0> User
=> User (call 'User.connection' to establish a connection)
irb(main):002:0> User.connection; nil #call nil to stop repl spitting out the connection object (long)
=> nil
irb(main):003:0> User
User(id: integer, name: string, email: string, etc...)

OP просто хочет имена столбцов.
Райан Бигг

Может быть. Но не обязательно. Это альтернативный способ получить их с дополнительной информацией, которая иногда бывает полезной при выводе списка столбцов с консоли
Yule

1
Это тоже полезный способ узнать, ИМО. @Yule - запрашивает ли этот код схемы / миграции и т.д. или запрашивает БД? Причина, по которой я спрашиваю, заключается в том, что я обнаружил несоответствие между моей схемой и тем, что на самом деле было в БД (одна миграция не удалась), поэтому мне нужно было быть уверенным, что я вижу то, что на самом деле было в таблице.
Эндрю

@Andrew он запрашивает БД (отсюда и необходимость установить соединение в rails 4)
Yule

5

Если вы знакомы с командами SQL, вы можете войти в папку своего приложения и запустить rails db, что является краткой формой rails dbconsole. Он войдет в оболочку вашей базы данных, будь то sqlite или mysql.

Затем вы можете запросить столбцы таблицы с помощью команды sql, например:

pragma table_info(your_table);

1
Для использования describe your_table;
mySQL

2

Вы можете запустить rails dbconsoleинструмент командной строки, чтобы открыть консоль sqlite. Затем введите, чтобы вывести .tablesсписок всех таблиц и .fullschemaполучить список всех таблиц с именами и типами столбцов.


Вы можете использовать онлайн-консоль базы данных (gem activeadmin-sqlpage ), как описано в этом ответе, если вы используете активного администратора.
oklas 01

1
  • Чтобы получить список столбцов в таблице , я обычно иду с этим:
    Model.column_names.sort.
    i.e. Orders.column_names.sort

    Сортировка названий столбцов позволяет легко найти то, что вы ищете.

  • Для получения более подробной информации о каждом из столбцов используйте:
    Model.columns.map{|column| [column.name, column.sql_type]}.to_h.

Это даст хороший хеш. например:

{
   id => int(4),
   created_at => datetime
}

1

дополняя эту полезную информацию, например, используя rails console o rails dbconsole:

Студент - моя модель, использующая консоль рельсов:

$ rails console
> Student.column_names
 => ["id", "name", "surname", "created_at", "updated_at"] 

> Student
 => Student(id: integer, name: string, surname: string, created_at: datetime, updated_at: datetime)

Другой вариант с использованием SQLite через Rails:

$ rails dbconsole

sqlite> .help

sqlite> .table
ar_internal_metadata  relatives             schools             
relationships         schema_migrations     students 

sqlite> .schema students
CREATE TABLE "students" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "surname" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);

Наконец для получения дополнительной информации.

sqlite> .help

Надеюсь это поможет!


-1

Для более компактного формата и меньшего набора текста:

Portfolio.column_types 

Не существует в рельсах 5+
Пак
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.