ActiveRecord: Lista kolumn w tabeli z konsoli

112

Wiem, że możesz poprosić ActiveRecord o wyświetlenie tabel w konsoli za pomocą:

ActiveRecord::Base.connection.tables

Czy istnieje polecenie, które wyświetli listę kolumn w podanej tabeli?

Andrzej
źródło

Odpowiedzi:

213

Spowoduje to wyświetlenie nazw_kolumn z tabeli

Model.column_names
e.g. User.column_names
Pravin
źródło
16
Możesz także uruchomić coś takiego, jak Model.columnsuzyskać więcej informacji o kolumnach, w tym dane konfiguracyjne bazy danych.
srt32
1
Wspaniały! Użycie Model.columnszapewnia wszystkie informacje dotyczące tabeli za pośrednictwem ActiveRecord. Co najważniejsze, był to dla mnie jedyny i najłatwiejszy sposób na uzyskanie pewności co do tego, jaki naprawdę był mój klucz główny na poziomie bazy danych.
Nibbex
2
Zawsze możesz użyć Model.primary_key, który podaje nazwę klucza podstawowego według rails. (To będzie 'id', chyba że jest zadeklarowane w modelu jako coś innego).
AJFaraday,
57

Pobiera kolumny, a nie tylko nazwy kolumn, i używa ActiveRecord :: Base :: Connection, więc żadne modele nie są potrzebne. Przydatny do szybkiego wyprowadzania struktury bazy danych.

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

Przykładowe dane wyjściowe: http://screencast.com/t/EsNlvJEqM

Aaron Henderson
źródło
W railsach 3.2 zrobienie tego w ten sposób nie ustawia primarypoprawnie atrybutu (wszystkie kolumny mają primary=nil). Jest ustawiony poprawnie Model.columnsmetodą sugerowaną przez srt32.
sayap
1
To jest właściwa odpowiedź. Nie ma wymogu posiadania modelu. Nie każdy stół ma model. "has_many_and_belongs_to"
baash05
22

Używając szyn numer 3, możesz po prostu wpisać nazwę modelu:

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

Na szynach czwartych musisz najpierw nawiązać połączenie:

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...)
Święta Bożego Narodzenia
źródło
OP chce tylko nazw kolumn.
Ryan Bigg
Być może. Ale niekoniecznie. Jest to alternatywny sposób na uzyskanie ich z dodatkowymi informacjami, które czasami są przydatne podczas wyświetlania kolumn z konsoli
Yule,
1
Jest to również przydatna metoda, IMO. @Yule - czy wysyła zapytanie do kodu schematu / migracji itp., Czy też do bazy danych? Powodem, dla którego pytam, jest niedopasowanie między moim schematem a tym, co faktycznie znajdowało się w bazie danych (jedna migracja się zepsuła), więc konkretnie musiałem mieć pewność, że widzę, co faktycznie jest w tabeli.
Andrew,
@Andrew pyta DB (stąd potrzeba ustanowienia połączenia w szynach 4)
Yule
5

Jeśli dobrze znasz polecenia SQL, możesz wejść do folderu aplikacji i uruchomić rails db, co jest krótką formą rails dbconsole. Wejdzie do powłoki Twojej bazy danych, niezależnie od tego, czy jest to sqlite, czy mysql.

Następnie możesz zapytać kolumny tabeli za pomocą polecenia sql, takiego jak:

pragma table_info(your_table);
gm2008
źródło
1
Do użytku z mySQL describe your_table;, nie jest idealny, ale działa
valk
2

Możesz uruchomić rails dbconsolew sobie narzędzie wiersza poleceń, aby otworzyć konsolę sqlite. Następnie wpisz, .tablesaby wyświetlić wszystkie tabele i .fullschemaotrzymać listę wszystkich tabel z nazwami i typami kolumn.

codeepic
źródło
Możesz użyć konsoli bazy danych online (gem activeadmin-sqlpage ) zgodnie z opisem w tej odpowiedzi, jeśli używasz aktywnego administratora.
oklas
1
  • Do listy kolumn w tabeli I zwykle z tym:
    Model.column_names.sort.
    i.e. Orders.column_names.sort

    Posortowanie nazw kolumn ułatwia znalezienie tego, czego szukasz.

  • Aby uzyskać więcej informacji na temat każdej z kolumn użyj tego:
    Model.columns.map{|column| [column.name, column.sql_type]}.to_h.

To zapewni niezły haszysz. na przykład:

{
   id => int(4),
   created_at => datetime
}
csebryam
źródło
1

uzupełnienie tych przydatnych informacji, na przykład za pomocą konsoli rails lub dbconsole rails:

Student jest moim modelem, używając konsoli railsów:

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

Inna opcja używania SQLite przez Railsy:

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

Wreszcie po więcej informacji.

sqlite> .help

Mam nadzieję że to pomoże!

Gamaliel
źródło
-1

Aby uzyskać bardziej kompaktowy format i mniej pisania, wystarczy:

Portfolio.column_types 
valk
źródło
Nie występuje w szynach 5+
Pak