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?

Antworten:


212

Dadurch werden die Spaltennamen aus einer Tabelle aufgelistet

Model.column_names
e.g. User.column_names

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


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

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

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.


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
}

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!


-1

Für ein kompakteres Format und weniger Eingabe nur:

Portfolio.column_types 

Existiert nicht in Schienen 5+
Pak
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.