ActiveRecord : 콘솔에서 테이블의 열 나열


112

ActiveRecord에 다음을 사용하여 콘솔에 테이블을 나열하도록 요청할 수 있다는 것을 알고 있습니다.

ActiveRecord::Base.connection.tables

주어진 테이블의 열을 나열하는 명령이 있습니까?

답변:


213

이것은 테이블의 column_names를 나열합니다.

Model.column_names
e.g. User.column_names

16
Model.columns데이터베이스 구성 데이터를 포함하여 열에 대한 자세한 정보를 얻으려면 같은 것을 실행할 수도 있습니다 .
srt32

1
큰! Using Model.columns은 ActiveRecord를 통해 테이블에 대한 모든 정보를 제공합니다. 결정적으로 그것은 데이터베이스 수준에서 내 기본 키가 실제로 무엇인지 확신을 얻을 수있는 유일하고 쉬운 방법 이었습니다.
nibbex 2015 년

2
레일에 따라 기본 키의 이름을 제공하는 Model.primary_key를 항상 사용할 수 있습니다. (모델에서 다른 것으로 선언되지 않는 한 'id'가됩니다.)
AJFaraday 2015

57

이것은 열 이름뿐만 아니라 열을 가져오고 ActiveRecord :: Base :: Connection을 사용하므로 모델이 필요하지 않습니다. 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


Rails 3.2에서 이렇게하면 어떻게 든 primary속성이 올바르게 설정되지 않습니다 (모든 열에 primary=nil). Model.columnssrt32에서 제안한 방법으로 올바르게 설정되어 있습니다.
sayap apr

1
이것이 정답입니다. 모델을 가질 필요는 없습니다. 모든 테이블에 모델이있는 것은 아닙니다. "has_many_and_belongs_to"
baash05

22

레일 3을 사용하여 모델 이름을 입력 할 수 있습니다.

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

레일 4에서는 먼저 연결을 설정해야합니다.

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는 열 이름 만 원합니다.
Ryan Bigg 2011

혹시. 하지만 반드시 그런 것은 아닙니다. 콘솔에서 열을 나열 할 때 도움이되는 추가 정보를 가져 오는 다른 방법입니다.
Yule

1
이것은 또한 IMO라는 유용한 방법입니다. @Yule-스키마 / 마이그레이션 코드 등을 쿼리합니까 아니면 DB를 쿼리합니까? 내가 묻는 이유는 내 스키마와 실제로 DB에있는 것과 (하나의 마이그레이션에 결함이 있음) 불일치가 발생했기 때문에 특히 테이블에 실제로 무엇이 있는지 확인해야했습니다.
Andrew

@Andrew는 DB를 쿼리합니다 (따라서 레일 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 ) 을이 답변의 describerd로 사용할 수 있습니다.
oklas

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)

Rails를 통해 SQLite를 사용하는 다른 옵션 :

$ 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+ 레일에 존재하지 않습니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.