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 :: З'єднання, тому жодні моделі не потрібні. Зручно для швидкого виведення структури db.

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


У рейках 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 запитує БД (звідси необхідність встановлення з'єднання в рейках 4)
Yule

5

Якщо вам зручні команди SQL, ви можете ввести папку додатка і запустити rails db, що є короткою формою rails dbconsole. Він увійде в оболонку вашої бази даних, будь то sqlite чи mysql.

Потім ви можете запитувати стовпці таблиці за допомогою команди sql, наприклад:

pragma table_info(your_table);

1
Для використання mySQL describe your_table;не ідеально, але працює
valk

2

Ви можете запустити rails dbconsoleу вас інструмент командного рядка, щоб відкрити консоль sqlite. Потім введіть, .tablesщоб перерахувати всі таблиці та .fullschemaотримати список усіх таблиць із назвами та типами стовпців.


Ви можете використовувати консоль бази даних (gem activeadmin-sqlpage ), як описано в цій відповіді, якщо ви використовуєте активного адміністратора.
оклас

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

доповнюючи цю корисну інформацію, наприклад, використовуючи рейки консолі або рейки 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.