ActiveRecord: Konsoldaki tablodaki sütunları listeleyin


112

Şunları kullanarak ActiveRecord'dan konsolda tabloları listelemesini isteyebileceğinizi biliyorum:

ActiveRecord::Base.connection.tables

Belirli bir tablodaki sütunları listeleyen bir komut var mı?

Yanıtlar:


213

Bu, bir tablodaki sütun adlarını listeleyecektir

Model.column_names
e.g. User.column_names

16
Ayrıca Model.columns, veritabanı yapılandırma verileri dahil olmak üzere sütunlar hakkında daha fazla bilgi almak gibi bir şey de çalıştırabilirsiniz .
srt32

1
Harika! Kullanımı Model.columns, ActiveRecord aracılığıyla bir tablo için tüm bilgileri sağlar. Benim için çok önemli olan, birincil anahtarımın veritabanı düzeyinde gerçekte ne olduğuna dair güven kazanmanın tek ve en kolay yoluydu .
nibbex

2
Raylara göre birincil anahtarın adını veren Model.primary_key'i her zaman kullanabilirsiniz. (Modelde başka bir şey olarak belirtilmediği sürece bu 'id' olacaktır).
AJFaraday

57

Bu sadece sütun adlarını değil, sütunları da alır ve ActiveRecord :: Base :: Connection'ı kullanır, bu nedenle hiçbir modele gerek yoktur. Bir db yapısının hızlı bir şekilde çıktısını almak için kullanışlıdır.

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

Örnek çıktı: http://screencast.com/t/EsNlvJEqM


Ray 3.2'de, bunu bu şekilde yapmak, primaryniteliği doğru şekilde ayarlamaz (tüm sütunlar vardır primary=nil). Model.columnsSrt32'nin önerdiği yöntemle doğru bir şekilde ayarlanır .
2014

1
Bu doğru cevap. Model sahibi olmaya gerek yoktur. Her tablonun bir modeli yoktur. "has_many_and_belongs_to"
baash05

22

Üç numaralı rayları kullanarak model adını yazabilirsiniz:

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

Dördüncü raylarda, önce bir bağlantı kurmanız gerekir:

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 sadece sütun adlarını istiyor.
Ryan Bigg

Belki. Ama zorunlu olarak değil. Ekstra bilgi edinmenin alternatif bir yoludur ve bazen konsoldan sütunları
sıralarken

1
Bu aynı zamanda bilinmesi gereken yararlı bir yöntem, IMO. @Yule - bu şema / geçiş kodunu vb. Sorguluyor mu yoksa DB'yi mi sorguluyor? Sormamın nedeni, şemam ile DB'de gerçekte olan şey arasında bir uyumsuzluk yaşıyor olmamdı (bir geçiş aksadı), bu yüzden özellikle tabloda gerçekte ne olduğunu gördüğümden emin olmam gerekiyordu.
Andrew

@Andrew DB'yi sorgular (bu nedenle raylar 4'te bir bağlantı kurma ihtiyacı doğar)
Yule

5

SQL komutları konusunda rahatsanız, uygulamanızın klasörüne girebilir ve rails db kısa bir rails dbconsole. İster sqlite ister mysql olsun veritabanınızın kabuğuna girecektir.

Ardından, aşağıdaki gibi sql komutunu kullanarak tablo sütunlarını sorgulayabilirsiniz:

pragma table_info(your_table);

1
MySQL kullanımı describe your_table;için mükemmel değil ama çalışıyor
valk

2

rails dbconsoleSqlite konsolunu açmak için komut satırı aracını çalıştırabilirsiniz . Ardından yazdığınız .tablesliste tüm tablolara ve .fullschemasütun adları ve türleri ile tüm tabloların bir listesini almak için.


Aktif yönetici kullanıyorsanız bu cevapta açıklandığı gibi çevrimiçi veritabanı konsolunu (gem activeadmin-sqlpage ) kullanabilirsiniz.
oklas

1
  • Genellikle bu ile gitmek bir tablodaki sütunları listelemek için:
    Model.column_names.sort.
    i.e. Orders.column_names.sort

    Sütun adlarını sıralamak, aradığınızı bulmanızı kolaylaştırır.

  • Hakkında daha fazla bilgi için sütunların her biri bu kullanın:
    Model.columns.map{|column| [column.name, column.sql_type]}.to_h.

Bu güzel bir hash sağlayacaktır. Örneğin:

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

1

bu yararlı bilgileri tamamlayan, örneğin raylar konsolu veya raylar dbconsole kullanımı:

Öğrenci benim Modelimdir, raylar konsolunu kullanarak:

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

Rails üzerinden SQLite kullanan diğer seçenek:

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

Son olarak daha fazla bilgi için.

sqlite> .help

Bu yardımcı olur umarım!


-1

Daha kompakt bir format ve daha az yazarak sadece:

Portfolio.column_types 

5+ raylarda mevcut değil
Pak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.