ActiveRecord: elenca le colonne nella tabella dalla console


112

So che puoi chiedere ad ActiveRecord di elencare le tabelle nella console usando:

ActiveRecord::Base.connection.tables

Esiste un comando che elencherebbe le colonne in una determinata tabella?

Risposte:


213

Questo elencherà i nomi delle colonne da una tabella

Model.column_names
e.g. User.column_names

16
Puoi anche eseguire qualcosa come Model.columnsper ottenere maggiori informazioni sulle colonne, inclusi i dati di configurazione del database.
srt32

1
Grande! L'utilizzo Model.columnsfornisce tutte le informazioni per una tabella tramite ActiveRecord. Fondamentale per me è stato l'unico e più semplice modo per acquisire fiducia in quella che era veramente la mia chiave primaria a livello di database.
nibbex

2
Puoi sempre usare Model.primary_key, che ti dà il nome della chiave primaria in base a rails. (Questo sarà "id" a meno che non sia dichiarato nel modello come qualcos'altro).
AJFaraday

57

Questo ottiene le colonne, non solo i nomi delle colonne e utilizza ActiveRecord :: Base :: Connection, quindi non sono necessari modelli. Comodo per riprodurre rapidamente la struttura di un 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

Output di esempio: http://screencast.com/t/EsNlvJEqM


In rails 3.2, farlo in questo modo in qualche modo non imposta primarycorrettamente l' attributo (tutte le colonne lo hanno primary=nil). È impostato correttamente con il Model.columnsmetodo suggerito da srt32.
sayap

1
Questa è la risposta esatta. Non è necessario disporre di un modello. Non tutti i tavoli hanno un modello. "has_many_and_belongs_to"
baash05

22

Usando tre binari puoi semplicemente digitare il nome del modello:

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

In binari quattro, devi prima stabilire una connessione:

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 vuole solo i nomi delle colonne.
Ryan Bigg

Forse. Ma non necessariamente. È un modo alternativo per ottenerli con informazioni extra che a volte sono utili quando si elencano le colonne dalla console
Yule

1
Questo è anche un metodo utile da sapere, IMO. @Yule - questo interroga il codice dello schema / migrazioni ecc. O interroga il DB? Il motivo per cui lo chiedo è che stavo riscontrando una mancata corrispondenza tra il mio schema e ciò che era effettivamente nel DB (una migrazione si è interrotta), quindi in particolare dovevo essere sicuro di vedere cosa c'era effettivamente nella tabella.
Andrew

@Andrew interroga il DB (da qui la necessità di stabilire una connessione in rails 4)
Yule

5

Se hai dimestichezza con i comandi SQL, puoi accedere alla cartella della tua app ed eseguire rails db, che è una breve forma di rails dbconsole. Entrerà nella shell del tuo database, che sia sqlite o mysql.

Quindi, puoi interrogare le colonne della tabella usando il comando sql come:

pragma table_info(your_table);

1
Per l'uso con mySQL describe your_table;, non perfetto ma funziona
valk

2

Puoi eseguire rails dbconsolelo strumento della riga di comando per aprire la console sqlite. Quindi digita .tablesper elencare tutte le tabelle e .fullschemaper ottenere un elenco di tutte le tabelle con nomi e tipi di colonne.


Puoi utilizzare la console del database online (gem activeadmin-sqlpage ) come descritto in questa risposta se utilizzi l'amministratore attivo.
oklas

1
  • Per elencare le colonne di una tabella di solito vado con questo:
    Model.column_names.sort.
    i.e. Orders.column_names.sort

    L'ordinamento dei nomi delle colonne rende facile trovare ciò che stai cercando.

  • Per ulteriori informazioni su ciascuna delle colonne utilizzare questo:
    Model.columns.map{|column| [column.name, column.sql_type]}.to_h.

Questo fornirà un bel hash. per esempio:

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

1

integrando queste utili informazioni, ad esempio usando rails console o rails dbconsole:

Lo studente è il mio modello, usando la console rails:

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

Altra opzione utilizzando SQLite tramite 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);

Infine per ulteriori informazioni.

sqlite> .help

Spero che questo ti aiuti!


-1

Per un formato più compatto e meno battitura, basta:

Portfolio.column_types 

Non esiste nei binari 5+
Pak
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.