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

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

ActiveRecord::Base.connection.tables

是否有命令列出给定表中的列?

103360 次浏览

这将列出表中的 column _ name

Model.column_names
e.g. User.column_names

使用 Rails three,你只需输入模型名称:

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

在 Rails4中,首先需要建立一个连接:

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

这将获取列,而不仅仅是列名,并使用 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

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

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

pragma table_info(your_table);

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

  • 要列出表中的列,我通常使用以下方法:
    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
}

更紧凑的格式,更少的键入:

Portfolio.column_types

补充这些有用的信息,例如使用 Rails 控制台 o Rails dbsole:

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

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

希望这个能帮上忙!

我正在使用 Rails6.1,并为此构建了一个简单的 rake 任务。

如果您想要一个具有字段名称的简单输出,可以使用 rails db:list[users]从 cli 调用它。如果你想要所有的细节,然后做 rails db:list[users,1]

我是根据关于向 rake 任务传递命令行参数的问题 如何向 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