ActiveRecord: แสดงรายการคอลัมน์ในตารางจากคอนโซล


112

ฉันรู้ว่าคุณสามารถขอให้ ActiveRecord แสดงรายการตารางในคอนโซลโดยใช้:

ActiveRecord::Base.connection.tables

มีคำสั่งที่จะแสดงรายการคอลัมน์ในตารางที่กำหนดหรือไม่

คำตอบ:


213

ซึ่งจะแสดงรายการ column_names จากตาราง

Model.column_names
e.g. User.column_names

16
คุณยังสามารถเรียกใช้สิ่งที่ต้องการModel.columnsเพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับคอลัมน์รวมถึงข้อมูลการกำหนดค่าฐานข้อมูล
srt32

1
เยี่ยมมาก! การใช้Model.columnsให้ข้อมูลทั้งหมดสำหรับตารางผ่าน ActiveRecord สิ่งสำคัญสำหรับฉันมันเป็นวิธีเดียวและง่ายที่สุดในการสร้างความมั่นใจว่าคีย์หลักของฉันอยู่ที่ระดับฐานข้อมูลจริงๆ
nibbex

2
คุณสามารถใช้ Model.primary_key ได้ตลอดเวลาซึ่งจะทำให้คุณมีชื่อของคีย์หลักตามราง (นี่จะเป็น 'id' เว้นแต่จะประกาศในโมเดลเป็นอย่างอื่น)
AJFaraday

57

สิ่งนี้ได้รับคอลัมน์ไม่ใช่แค่ชื่อคอลัมน์และใช้ ActiveRecord :: Base :: Connection ดังนั้นจึงไม่จำเป็นต้องมีโมเดล สะดวกสำหรับการส่งออกโครงสร้างของฐานข้อมูลอย่างรวดเร็ว

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

ตัวอย่างผลลัพธ์: http://screencast.com/t/EsNlvJEqM


ในราง 3.2 การทำเช่นนี้ไม่ได้ตั้งค่าprimaryแอตทริบิวต์อย่างถูกต้อง (ทุกคอลัมน์มีprimary=nil) ตั้งค่าอย่างถูกต้องด้วยModel.columnsวิธีที่แนะนำโดย srt32
sayap

1
นี่คือคำตอบที่ใช่ ไม่มีข้อกำหนดว่าต้องมีแบบจำลอง ไม่ใช่ทุกโต๊ะที่มีแบบจำลอง "has_many_and_belongs_to"
baash05

22

การใช้รางสามคุณสามารถพิมพ์ชื่อรุ่น:

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

ในรางสี่คุณต้องสร้างการเชื่อมต่อก่อน:

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 เพียงต้องการชื่อคอลัมน์
Ryan Bigg

บางที แต่ไม่จำเป็น เป็นอีกทางเลือกหนึ่งในการรับข้อมูลเพิ่มเติมที่บางครั้งมีประโยชน์เมื่อแสดงรายการคอลัมน์จากคอนโซล
คริสต์มาส

1
นี่เป็นวิธีการที่มีประโยชน์ที่ควรทราบ IMO @Yule - สิ่งนี้จะสอบถามรหัสสคีมา / การย้ายข้อมูล ฯลฯ หรือไม่หรือจะสอบถามฐานข้อมูล? เหตุผลที่ฉันถามคือฉันพบความไม่ตรงกันระหว่างสคีมาของฉันกับสิ่งที่เป็นจริงในฐานข้อมูล (การย้ายข้อมูลหนึ่งรายการผิดพลาด) ดังนั้นโดยเฉพาะฉันต้องแน่ใจว่าฉันเห็นสิ่งที่อยู่ในตารางจริงๆ
Andrew

@ แอนดรูว์ค้นหา DB (ดังนั้นจึงจำเป็นต้องสร้างการเชื่อมต่อในราง 4)
คริสต์มาส

5

หากคุณพอใจกับคำสั่ง SQL คุณสามารถเข้าสู่โฟลเดอร์ของแอปและเรียกใช้rails dbซึ่งเป็นรูปแบบย่อของrails dbconsoleไฟล์. มันจะเข้าสู่เชลล์ของฐานข้อมูลของคุณไม่ว่าจะเป็น sqlite หรือ mysql

จากนั้นคุณสามารถสอบถามคอลัมน์ของตารางโดยใช้คำสั่ง sql เช่น:

pragma table_info(your_table);

1
สำหรับการใช้งาน mySQL describe your_table;ไม่สมบูรณ์แบบ แต่ใช้งานได้
valk

2

คุณสามารถเรียกใช้rails dbconsoleเครื่องมือบรรทัดคำสั่งเพื่อเปิดคอนโซล sqlite จากนั้นพิมพ์.tablesเพื่อแสดงรายการตารางทั้งหมดและ.fullschemaรับรายชื่อตารางทั้งหมดพร้อมชื่อคอลัมน์และประเภท


คุณสามารถใช้คอนโซลฐานข้อมูลออนไลน์ (gem activeadmin-sqlpage ) เป็น describerd ในคำตอบนี้หากคุณใช้ active admin
oklas

1

  • Model.column_names.sortการแสดงรายชื่อคอลัมน์ในตารางผมมักจะไปกับเรื่องนี้ที่:
    i.e. Orders.column_names.sort

    การจัดเรียงชื่อคอลัมน์ทำให้ง่ายต่อการค้นหาสิ่งที่คุณกำลังมองหา


  • Model.columns.map{|column| [column.name, column.sql_type]}.to_hสำหรับข้อมูลเพิ่มเติมเกี่ยวกับแต่ละคอลัมน์ที่ใช้นี้

สิ่งนี้จะให้แฮชที่ดี ตัวอย่างเช่น:

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

1

การเสริมข้อมูลที่เป็นประโยชน์นี้ตัวอย่างเช่นการใช้คอนโซลราง o ราง dbconsole:

นักเรียนคือโมเดลของฉันโดยใช้คอนโซลราง:

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

ตัวเลือกอื่น ๆ ที่ใช้ SQLite ผ่าน 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);

สุดท้ายสำหรับข้อมูลเพิ่มเติม

sqlite> .help

หวังว่านี่จะช่วยได้!


-1

สำหรับรูปแบบที่กะทัดรัดยิ่งขึ้นและพิมพ์น้อยลงเพียง:

Portfolio.column_types 

ไม่มีในราง 5+
ปาก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.