ActiveRecord: enumerar columnas en la tabla desde la consola


112

Sé que puede pedirle a ActiveRecord que enumere las tablas en la consola usando:

ActiveRecord::Base.connection.tables

¿Existe un comando que enumere las columnas en una tabla determinada?

Respuestas:


213

Esto listará los column_names de una tabla

Model.column_names
e.g. User.column_names

16
También puede ejecutar algo como Model.columnspara obtener más información sobre las columnas, incluidos los datos de configuración de la base de datos.
srt32

1
¡Excelente! El uso Model.columnsproporciona toda la información para una tabla a través de ActiveRecord. Fundamentalmente para mí, fue la única y más sencilla forma de ganar confianza en cuál era realmente mi clave principal a nivel de base de datos.
nibbex

2
Siempre puede usar Model.primary_key, que le da el nombre de la clave principal de acuerdo con los rieles. (Esto será 'id' a menos que se declare en el modelo como otra cosa).
AJFaraday

57

Esto obtiene las columnas, no solo los nombres de las columnas y usa ActiveRecord :: Base :: Connection, por lo que no se necesitan modelos. Útil para generar rápidamente la estructura de una base de datos.

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

Salida de muestra: http://screencast.com/t/EsNlvJEqM


En rails 3.2, hacerlo de esta manera de alguna manera no establece el primaryatributo correctamente (todas las columnas lo tienen primary=nil). Está configurado correctamente con el Model.columnsmétodo sugerido por srt32.
sayap

1
Esta es la respuesta correcta. No es necesario tener un modelo. No todas las mesas tienen un modelo. "has_many_and_belongs_to"
baash05

22

Usando los rieles tres, puede simplemente escribir el nombre del modelo:

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

En los carriles cuatro, primero debe establecer una conexión:

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 solo quiere los nombres de las columnas.
Ryan Bigg

Quizás. Pero no necesariamente. Es una forma alternativa de obtenerlos con información adicional que a veces es útil cuando se enumeran columnas desde la consola
Yule

1
Este también es un método útil para conocer, en mi opinión. @Yule: ¿esto consulta el código de esquema / migraciones, etc. o consulta la base de datos? La razón por la que pregunto es que estaba experimentando una falta de coincidencia entre mi esquema y lo que realmente estaba en la base de datos (una migración falló), por lo que específicamente necesitaba estar seguro de que estaba viendo lo que realmente estaba en la tabla.
Andrew

@Andrew consulta la base de datos (de ahí la necesidad de establecer una conexión en los carriles 4)
Yule

5

Si se siente cómodo con los comandos SQL, puede ingresar a la carpeta de su aplicación y ejecutarla rails db, que es una forma breve de rails dbconsole. Ingresará al shell de su base de datos, ya sea sqlite o mysql.

Luego, puede consultar las columnas de la tabla usando el comando sql como:

pragma table_info(your_table);

1
Para uso de mySQL describe your_table;, no es perfecto pero funciona
valk

2

Puede ejecutar rails dbconsolesu herramienta de línea de comandos para abrir la consola sqlite. Luego escriba .tablespara enumerar todas las tablas y .fullschemapara obtener una lista de todas las tablas con nombres y tipos de columnas.


Puede usar la consola de base de datos en línea (gem activeadmin-sqlpage ) como se describe en esta respuesta si usa el administrador activo.
oklas

1
  • Para una lista de las columnas de una tabla por lo general voy con esto:
    Model.column_names.sort.
    i.e. Orders.column_names.sort

    Ordenar los nombres de las columnas facilita la búsqueda de lo que busca.

  • Para obtener más información sobre cada una de las columnas utilizan este:
    Model.columns.map{|column| [column.name, column.sql_type]}.to_h.

Esto proporcionará un buen hash. por ejemplo:

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

1

complementando esta útil información, por ejemplo usando rails console o rails dbconsole:

El estudiante es mi modelo, usando la consola de rieles:

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

Otra opción usando SQLite a través de 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);

Finalmente para más información.

sqlite> .help

¡Espero que esto ayude!


-1

Para un formato más compacto y menos mecanografía, simplemente:

Portfolio.column_types 

No existe en rieles 5+
Pak
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.