ActiveRecord:从控制台列出表中的列


Answers:


213

这将列出表中的column_names

Model.column_names
e.g. User.column_names

16
您还可以运行类似的操作Model.columns来获取有关列的更多信息,包括数据库配置数据。
srt32

1
大!使用Model.columns通过ActiveRecord提供表的所有信息。对我而言至关重要的是,这是对我的主键真正在数据库级别上获得信任的唯一且最简单的方法。
nibbex

2
您可以始终使用Model.primary_key,它根据rails为您提供主键的名称。(除非在模型中声明为其他值,否则它将为“ id”)。
AJFaraday 2015年

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


在rails 3.2中,以这种方式执行此操作会以某种方式无法primary正确设置属性(所有列都有primary=nil)。使用Model.columnssrt32建议的方法正确设置。
sayap 2014年

1
这是正确的答案。不需要具有模型。并非每个表格都有一个模型。“ has_many_and_belongs_to”
baash05,

22

使用rails 3,您只需键入模型名称:

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

在导轨4中,您需要首先建立连接:

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

也许。但不一定。这是让他们获得额外信息的另一种方式,有时在从控制台列出列时会有所帮助
Yule

1
IMO,这也是一种有用的方法。@Yule-这是查询架构/迁移代码等,还是查询数据库?我问的原因是,我的架构与数据库中的实际内容不匹配(一次迁移出现故障),因此我特别需要确保我看到表中的实际内容。
安德鲁

@Andrew它查询数据库(因此需要在rails 4中建立连接)
Yule

5

如果您熟悉SQL命令,则可以输入应用程序的文件夹并运行rails db,这是的简短形式rails dbconsole。它将进入数据库的外壳,无论是sqlite还是mysql。

然后,您可以使用sql命令查询表列,如下所示:

pragma table_info(your_table);

1
对于MySQL的使用describe your_table;,并不完美,但作品
德沃克

2

您可以rails dbconsole在命令行工具中运行以打开sqlite控制台。然后键入.tables以列出所有表,并.fullschema获得具有列名和类型的所有表的列表。


如果您使用活动管理员,则可以按照此答案中的describerd来使用在线数据库控制台(gem activeadmin-sqlpage)。
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

补充这些有用的信息,例如使用rails console o rails dbconsole:

学生是我的模型,使用rails控制台:

$ 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使用SQLite的其他选项:

$ 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 

在Rails 5+中不存在
Pak
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.