ActiveRecord: liste les colonnes du tableau à partir de la console


112

Je sais que vous pouvez demander à ActiveRecord de répertorier les tables dans la console en utilisant:

ActiveRecord::Base.connection.tables

Existe-t-il une commande qui listerait les colonnes dans une table donnée?

Réponses:


213

Cela listera les noms de colonne d'une table

Model.column_names
e.g. User.column_names

16
Vous pouvez également exécuter quelque chose comme Model.columnspour obtenir plus d'informations sur les colonnes, y compris les données de configuration de la base de données.
srt32

1
Génial! L'utilisation Model.columnsfournit toutes les informations d'une table via ActiveRecord. Pour moi, c'était le seul et le plus simple moyen de gagner en confiance en ce qu'était vraiment ma clé primaire au niveau de la base de données.
nibbex

2
Vous pouvez toujours utiliser Model.primary_key, qui vous donne le nom de la clé primaire en fonction des rails. (Ce sera 'id' sauf s'il est déclaré dans le modèle comme autre chose).
AJFaraday

57

Cela obtient les colonnes, pas seulement les noms de colonnes et utilise ActiveRecord :: Base :: Connection, donc aucun modèle n'est nécessaire. Pratique pour sortir rapidement la structure d'une base de données.

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

Exemple de sortie: http://screencast.com/t/EsNlvJEqM


Dans rails 3.2, procéder de cette manière ne définit pas primarycorrectement l' attribut (toutes les colonnes l'ont primary=nil). Il est défini correctement avec la Model.columnsméthode suggérée par srt32.
sayap

1
C'est la bonne réponse. Il n'est pas nécessaire d'avoir un modèle. Toutes les tables n'ont pas de modèle. "has_many_and_belongs_to"
baash05

22

En utilisant les rails trois, vous pouvez simplement taper le nom du modèle:

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

Dans les rails quatre, vous devez d'abord établir une connexion:

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 veut juste les noms de colonnes.
Ryan Bigg

Peut-être. Mais pas forcément. C'est une autre façon de les obtenir avec des informations supplémentaires qui sont parfois utiles lors de la liste des colonnes de la console
Yule

1
C'est aussi une méthode utile à connaître, IMO. @Yule - cela interroge-t-il le schéma / code de migration, etc. ou interroge-t-il la base de données? La raison pour laquelle je pose la question est que je rencontrais une incompatibilité entre mon schéma et ce qui se trouvait réellement dans la base de données (une migration a échoué), donc je devais spécifiquement être sûr de voir ce qui était réellement dans le tableau.
Andrew le

@Andrew il interroge la DB (d'où la nécessité d'établir une connexion dans les rails 4)
Yule

5

Si vous êtes à l'aise avec les commandes SQL, vous pouvez entrer le dossier de votre application et l'exécuter rails db, qui est une forme brève de rails dbconsole. Il entrera dans le shell de votre base de données, que ce soit sqlite ou mysql.

Ensuite, vous pouvez interroger les colonnes de la table à l'aide de la commande sql comme:

pragma table_info(your_table);

1
Pour une utilisation mySQL describe your_table;, pas parfait mais fonctionne
valk

2

Vous pouvez exécuter rails dbconsoledans votre outil de ligne de commande pour ouvrir la console sqlite. Tapez ensuite .tablespour lister toutes les tables et .fullschemapour obtenir une liste de toutes les tables avec les noms et types de colonnes.


Vous pouvez utiliser la console de base de données en ligne (gem activeadmin-sqlpage ) comme décrit dans cette réponse si vous utilisez l'administrateur actif.
oklas

1
  • Pour lister les colonnes dans un tableau que je vais habituellement avec ceci:
    Model.column_names.sort.
    i.e. Orders.column_names.sort

    Le tri des noms de colonnes permet de trouver facilement ce que vous recherchez.

  • Pour plus d' informations sur chacune des colonnes utilisent ceci:
    Model.columns.map{|column| [column.name, column.sql_type]}.to_h.

Cela fournira un bon hachage. par exemple:

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

1

en complément de ces informations utiles, par exemple en utilisant les rails console o rails dbconsole:

L'élève est mon modèle, en utilisant la console de 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)

Autre option utilisant SQLite via 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);

Enfin pour plus d'informations.

sqlite> .help

J'espère que cela t'aides!


-1

Pour un format plus compact et moins de saisie, il suffit de:

Portfolio.column_types 

N'existe pas dans les rails 5+
Pak
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.