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

Posted

技术标签:

【中文标题】ActiveRecord:从控制台列出表中的列【英文标题】:ActiveRecord: List columns in table from console 【发布时间】:2011-07-31 08:44:15 【问题描述】:

我知道您可以要求 ActiveRecord 在控制台中列出表格:

ActiveRecord::Base.connection.tables

是否有一个命令可以列出给定表中的列?

【问题讨论】:

【参考方案1】:

这将列出表中的 column_names

Model.column_names
e.g. User.column_names

【讨论】:

您也可以运行Model.columns 之类的命令来获取有关列的更多信息,包括数据库配置数据。 太棒了!使用 Model.columns 通过 ActiveRecord 提供表的所有信息。对我来说至关重要的是,这是唯一且最简单的方法,可以让我对我的主键在数据库级别的真实情况充满信心。 你总是可以使用 Model.primary_key,它会根据 Rails 为你提供主键的名称。 (这将是“id”,除非它在模型中声明为其他内容)。【参考方案2】:

这会获取列,而不仅仅是列名并使用 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)。使用 srt32 建议的Model.columns 方法正确设置。 这是正确的答案。不需要有模型。并非每张桌子都有模型。 “has_many_and_belongs_to” 要提供按表名排序的列表,请使用:ActiveRecord::Base.connection.tables.sort.each【参考方案3】:

使用 rails 3,您只需输入型号名称:

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

在rails 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 只想要列名。 也许吧。但不一定。这是一种获取额外信息的替代方法,有时在从控制台列出列时很有帮助 这也是一种有用的了解方法,IMO。 @Yule - 这是查询模式/迁移代码等还是查询数据库?我问的原因是我的架构与数据库中的实际内容不匹配(一次迁移出现故障),所以特别需要确保我看到了表中的实际内容。 @Andrew 它查询数据库(因此需要在 rails 4 中建立连接)【参考方案4】:

如果您熟悉 SQL 命令,您可以进入您应用的文件夹并运行rails db,这是rails dbconsole 的简写形式。它会进入你数据库的shell,不管是sqlite还是mysql

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

pragma table_info(your_table);

【讨论】:

对于 mySQL 使用 describe your_table;,虽然不完美但可以使用【参考方案5】:

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

【讨论】:

如果您使用活动管理员,您可以使用在线数据库控制台(gem activeadmin-sqlpage)作为 this answer 中的 describerd。【参考方案6】:

补充这些有用的信息,例如使用 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

希望这会有所帮助!

【讨论】:

【参考方案7】:

要列出表格中的列,我通常会使用:Model.column_names.sorti.e. Orders.column_names.sort

对列名进行排序可以轻松找到您要查找的内容。

有关每一列的更多信息,请使用:Model.columns.map|column| [column.name, column.sql_type].to_h

这将提供一个很好的哈希。 例如:


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

【讨论】:

【参考方案8】:

对于更紧凑的格式,只需更少的输入:

Portfolio.column_types 

【讨论】:

Rails 5+ 中不存在 答案没有说明,问题被标记为 Rails 3 @Pak... @SebastianPalma 我知道,但由于这是一个被广泛引用的问题,因此此类 cmets 对于快速寻找答案的人很有帮助。该标签可能是在最初的文章中选择的,但问题很笼统。【参考方案9】:

我正在使用 rails 6.1 并为此构建了一个简单的 rake 任务。

如果您想要一个带有字段名称的简单输出,您可以使用 rails db:list[users] 从 cli 调用它。如果您想了解所有详细信息,请执行rails db:list[users,1]

我从这个问题How to pass command line arguments to a rake task 构建了这个关于将命令行参数传递给 rake 任务的问题。我还建立在上面@aaron-henderson 的回答之上。

# run like `rails db:list[users]`, `rails db:list[users,1]`, `RAILS_ENV=development rails db:list[users]` etc
namespace :db do
  desc "list fields/details on a model"
  task :list, [:model, :details] => [:environment] do |task, args|
    model = args[:model]
    if !args[:details].present?
      model.camelize.constantize.column_names.each do |column_name|
        puts column_name
      end
    else
      ActiveRecord::Base.connection.tables.each do |table_name|
        next if table_name != model.underscore.pluralize
        ActiveRecord::Base.connection.columns(table_name).each do |c|
          puts "Name: #c.name | Type: #c.type | Default: #c.default | Limit: #c.limit | Precision: #c.precision | Scale: #c.scale | Nullable: #c.null "
        end
      end
    end
  end
end

【讨论】:

以上是关于ActiveRecord:从控制台列出表中的列的主要内容,如果未能解决你的问题,请参考以下文章

使用 ActiveRecord 语法从 Rails 中的连接表中选择或按列排序

yii2 数据库和ActiveRecord

为啥 Active Record 发送的数据与 schema.rb 不同?

如何从其他表中获取所需的列

Rails 中的表关联 - ActiveRecord

使用 VBA 从 Access 表中将选定的列导入 Excel