ActiveRecord: lista as colunas na tabela do console

112

Eu sei que você pode pedir ao ActiveRecord para listar tabelas no console usando:

ActiveRecord::Base.connection.tables

Existe um comando que lista as colunas em uma determinada tabela?

Andrew
fonte

Respostas:

213

Isto irá listar os column_names de uma tabela

Model.column_names
e.g. User.column_names
Pravin
fonte
16
Você também pode executar algo como Model.columnsobter mais informações sobre as colunas, incluindo dados de configuração do banco de dados.
srt32,
1
Ótimo! Usando Model.columnsfornece todas as informações de uma tabela por meio do ActiveRecord. Crucialmente para mim, era a única e mais fácil maneira de ganhar confiança no que realmente era minha chave primária no nível do banco de dados.
nibbex
2
Você sempre pode usar Model.primary_key, que fornece o nome da chave primária de acordo com rails. (Será 'id' a menos que seja declarado no modelo como outra coisa).
AJFaraday
57

Isso obtém as colunas, não apenas os nomes das colunas e usa ActiveRecord :: Base :: Connection, portanto, nenhum modelo é necessário. Prático para gerar rapidamente a estrutura de um banco de dados.

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

Saída de amostra: http://screencast.com/t/EsNlvJEqM

Aaron Henderson
fonte
No rails 3.2, fazer isso de alguma forma não define o primaryatributo corretamente (todas as colunas o fizeram primary=nil). Ele está configurado corretamente com o Model.columnsmétodo sugerido por srt32.
sayap
1
Esta é a resposta certa. Não é necessário ter um modelo. Nem toda mesa tem um modelo. "has_many_and_belongs_to"
baash05
22

Usando os trilhos três, você pode simplesmente digitar o nome do modelo:

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

Nos trilhos quatro, você precisa estabelecer uma conexão primeiro:

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...)
Yule
fonte
OP quer apenas os nomes das colunas.
Ryan Bigg,
Possivelmente. Mas não necessariamente. É uma maneira alternativa de obtê-los com informações extras que às vezes é útil ao listar colunas do console
Yule,
1
Este também é um método útil de saber, IMO. @Yule - isso consulta o código do esquema / migrações etc. ou consulta o banco de dados? A razão de eu perguntar é que eu estava tendo uma incompatibilidade entre meu esquema e o que realmente estava no banco de dados (uma migração falhou), então, especificamente, eu precisava ter certeza de que estava vendo o que realmente estava na tabela.
Andrew,
@Andrew ele consulta o DB (daí a necessidade de estabelecer uma conexão nos trilhos 4)
Yule
5

Se você estiver familiarizado com os comandos SQL, poderá entrar na pasta do seu aplicativo e executar rails db, que é uma forma breve de rails dbconsole. Ele entrará no shell do seu banco de dados, seja ele sqlite ou mysql.

Então, você pode consultar as colunas da tabela usando o comando sql como:

pragma table_info(your_table);
GM2008
fonte
1
Para uso em mySQL describe your_table;, não é perfeito, mas funciona
valk
2

Você pode executar rails dbconsoleem sua ferramenta de linha de comando para abrir o console sqlite. Em seguida, digite .tablespara listar todas as tabelas e .fullschemaobter uma lista de todas as tabelas com nomes e tipos de coluna.

codípico
fonte
Você pode usar o console de banco de dados online (gem activeadmin-sqlpage ) conforme descrito nesta resposta se você usar o administrador ativo.
Oklas,
1
  • Para listar as colunas de uma tabela Eu costumo ir com isso:
    Model.column_names.sort.
    i.e. Orders.column_names.sort

    Classificar os nomes das colunas facilita encontrar o que você está procurando.

  • Para mais informações sobre cada uma das colunas usar este:
    Model.columns.map{|column| [column.name, column.sql_type]}.to_h.

Isso fornecerá um bom hash. por exemplo:

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

complementando esta informação útil, por exemplo usando console rails ou dbconsole rails:

Aluno é meu modelo, usando console de trilhos:

$ 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)

Outra opção usando SQLite através de 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);

Finalmente, para mais informações.

sqlite> .help

Espero que isto ajude!

Gamaliel
fonte
-1

Para um formato mais compacto e menos digitação, basta:

Portfolio.column_types 
valk
fonte
Não existe nos trilhos 5+
Pak de