column - postgresql nosql json
Migración de Rails para convertir una cadena a un entero usando la conversión (3)
Hay una buena pregunta here que quiero explicar. Estoy tratando de convertir una columna en mi base de datos de una cadena a un entero.
Pensé que la conversión sería bastante directa para Wrad. Actualmente mis cuerdas son
["10", "12", "125", "135", "140", ...]
Mi archivo de migración incluye:
def change
change_column :table_name, :product_code, :integer
end
Rails intenta esto, pero Postgresql devuelve un error.
PG :: Error: ERROR: la columna "código_producto" no se puede convertir automáticamente al tipo entero
SUGERENCIA: especifique una expresión USING para realizar la conversión.
No estoy seguro de cómo uso esta expresión ''USO'' en mi migración de carriles.
Así que pensé que la conversión sería bastante sencilla. ¿Qué debo usar como la expresión USING?
Código ajustado para admitir la conversión de cadenas en blanco, también:
change_column :table_name, :product_code,
"integer USING NULLIF(product_code, '''')::int"
La cadena vacía se convierte en NULL
, que se convierte en 0
en la conversión de tipo, que es probablemente lo mejor que puede hacer en esta situación.
Cuando escribe migraciones de Rails para convertir una columna de cadena en un entero, normalmente escribiría así:
change_column :table_name, :column_name, :integer
Usted podría obtener esto:
PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer
HINT: Specify a USING expression to perform the conversion.
La "sugerencia" básicamente le dice que necesita confirmar que desea que esto suceda, y cómo se convertirán los datos. Solo di esto en tu migración:
change_column :table_name, :column_name, ''integer USING CAST(column_name AS integer)''
change_column :table_name, :product_code,
''integer USING CAST(product_code AS integer)''