ActiveRecord: Listet Spalten in der Tabelle von der Konsole aus auf

111

Ich weiß, dass Sie ActiveRecord bitten können, Tabellen in der Konsole aufzulisten, indem Sie:

ActiveRecord::Base.connection.tables

Gibt es einen Befehl, der die Spalten in einer bestimmten Tabelle auflistet?

Andrew
quelle

Antworten:

212

Dadurch werden die Spaltennamen aus einer Tabelle aufgelistet

Model.column_names
e.g. User.column_names
Pravin
quelle
16
Sie können auch so etwas ausführen Model.columns, um weitere Informationen zu den Spalten einschließlich der Datenbankkonfigurationsdaten zu erhalten.
srt32
1
Toll! Die Verwendung Model.columnsbietet alle Informationen für eine Tabelle über ActiveRecord. Entscheidend für mich war, dass dies der einzige und einfachste Weg war, Vertrauen in meinen Primärschlüssel auf Datenbankebene zu gewinnen.
Nibbex
2
Sie können jederzeit Model.primary_key verwenden, das Ihnen den Namen des Primärschlüssels gemäß Rails gibt. (Dies ist 'id', es sei denn, es ist im Modell als etwas anderes deklariert).
AJFaraday
56

Dadurch werden die Spalten und nicht nur die Spaltennamen abgerufen und ActiveRecord :: Base :: Connection verwendet, sodass keine Modelle erforderlich sind. Praktisch für die schnelle Ausgabe der Struktur einer Datenbank.

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

Beispielausgabe: http://screencast.com/t/EsNlvJEqM

Aaron Henderson
quelle
In Rails 3.2 wird das primaryAttribut auf diese Weise nicht richtig festgelegt (alle Spalten haben primary=nil). Es wird mit der Model.columnsvon srt32 vorgeschlagenen Methode korrekt eingestellt.
Sayap
1
Das ist die richtige Antwort. Es ist nicht erforderlich, ein Modell zu haben. Nicht jeder Tisch hat ein Modell. "has_many_and_belongs_to"
baash05
22

Mit Schienen drei können Sie einfach den Modellnamen eingeben:

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

In Schienen vier müssen Sie zuerst eine Verbindung herstellen:

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...)
Weihnachten
quelle
OP möchte nur die Spaltennamen.
Ryan Bigg
Vielleicht. Aber nicht unbedingt. Es ist eine alternative Möglichkeit, sie mit zusätzlichen Informationen zu versehen, die manchmal hilfreich sind, wenn Spalten von der Konsole
aufgelistet werden
1
Dies ist auch eine nützliche Methode, IMO. @Yule - fragt dies den Schema- / Migrationscode usw. ab oder fragt es die Datenbank ab? Der Grund, den ich frage, ist, dass ich eine Nichtübereinstimmung zwischen meinem Schema und dem, was tatsächlich in der Datenbank vorhanden war (eine Migration ist fehlerhaft), festgestellt habe. Daher musste ich unbedingt sicherstellen, dass ich sehe, was tatsächlich in der Tabelle enthalten ist.
Andrew
@ Andrew fragt die DB ab (daher die Notwendigkeit, eine Verbindung in Schienen 4 herzustellen)
Yule
5

Wenn Sie mit SQL-Befehlen vertraut sind, können Sie den Ordner Ihrer App eingeben und ausführen rails db. Dies ist eine Kurzform von rails dbconsole. Es wird in die Shell Ihrer Datenbank eingegeben, egal ob es sich um SQLite oder MySQL handelt.

Anschließend können Sie die Tabellenspalten mit dem Befehl sql wie folgt abfragen:

pragma table_info(your_table);
gm2008
quelle
1
Für mySQL verwenden describe your_table;, nicht perfekt, aber funktioniert
valk
2

Sie können rails dbconsolein Ihrem Befehlszeilentool ausführen , um die SQLite-Konsole zu öffnen. Geben Sie dann ein, um alle Tabellen .tablesaufzulisten und .fullschemaeine Liste aller Tabellen mit Spaltennamen und -typen zu erhalten.

Codeepic
quelle
Sie können die Online-Datenbankkonsole (gem activeadmin-sqlpage ) wie in dieser Antwort beschrieben verwenden, wenn Sie den aktiven Administrator verwenden.
Oklahoma
1
  • Um die Spalten in einer Tabelle aufzulisten, gehe ich normalerweise folgendermaßen vor :
    Model.column_names.sort.
    i.e. Orders.column_names.sort

    Durch Sortieren der Spaltennamen können Sie leicht finden, wonach Sie suchen.

  • Weitere Informationen zu den einzelnen Spalten finden Sie unter :
    Model.columns.map{|column| [column.name, column.sql_type]}.to_h.

Dies wird einen schönen Hash liefern. beispielsweise:

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

Ergänzen Sie diese nützlichen Informationen, z. B. mithilfe der Rails-Konsole oder der Rails-Datenbankkonsole:

Student ist mein Model mit Rails-Konsole:

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

Andere Option mit SQLite über 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);

Zum Schluss noch mehr Informationen.

sqlite> .help

Hoffe das hilft!

Gamaliel
quelle
-1

Für ein kompakteres Format und weniger Eingabe nur:

Portfolio.column_types 
valk
quelle
Existiert nicht in Schienen 5+
Pak