【发布时间】:2011-07-31 08:44:15
【问题描述】:
我知道您可以要求 ActiveRecord 在控制台中列出表格:
ActiveRecord::Base.connection.tables
是否有一个命令可以列出给定表中的列?
【问题讨论】:
标签: sql ruby-on-rails ruby-on-rails-3 activerecord
我知道您可以要求 ActiveRecord 在控制台中列出表格:
ActiveRecord::Base.connection.tables
是否有一个命令可以列出给定表中的列?
【问题讨论】:
标签: sql ruby-on-rails ruby-on-rails-3 activerecord
这将列出表中的 column_names
Model.column_names
e.g. User.column_names
【讨论】:
Model.columns 之类的命令来获取有关列的更多信息,包括数据库配置数据。
Model.columns 通过 ActiveRecord 提供表的所有信息。对我来说至关重要的是,这是唯一且最简单的方法,可以让我对我的主键在数据库级别的真实情况充满信心。
这会获取列,而不仅仅是列名并使用 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
【讨论】:
primary 属性(所有列都有 primary=nil)。使用 srt32 建议的Model.columns 方法正确设置。
使用 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);
【讨论】:
describe your_table;,虽然不完美但可以使用
您可以在命令行工具中运行rails dbconsole 来打开sqlite 控制台。然后输入.tables 列出所有表,输入.fullschema 获取所有表的列表以及列名和类型。
【讨论】:
补充这些有用的信息,例如使用 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
希望这会有所帮助!
【讨论】:
要列出表格中的列,我通常会使用: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 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
【讨论】: