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



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

ActiveRecord::Base.connection.tables

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

这将列出表中的column_names

Model.column_names
e.g. User.column_names

这将获取列,而不仅仅是列名,并使用ActiveRecord::Base::Connection,因此不需要模型。方便快速输出db的结构。

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,您只需输入模型名称:

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

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

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

pragma table_info(your_table);

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

Student is my Model, using rails console:

$ 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

希望这对你有帮助!

您可以在命令行工具中运行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
}

我使用rails 6.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

要获得更紧凑的格式,只需:

Portfolio.column_types 

相关内容

  • 没有找到相关文章

最新更新