Tengo un código que necesita asegurar que algunos datos estén en una enumeración mysql antes de la inserción en la base de datos. La manera más limpia que he encontrado para hacer esto es el siguiente código:¿Cómo puedo extraer limpiamente los valores enum de MySQL en Perl?
sub enum_values {
my ($self, $schema, $table, $column) = @_;
# don't eval to let the error bubble up
my $columns = $schema->storage->dbh->selectrow_hashref(
"SHOW COLUMNS FROM `$table` like ?",
{},
$column
);
unless ($columns) {
X::Internal::Database::UnknownColumn->throw(
column => $column,
table => $table,
);
}
my $type = $columns->{Type} or X::Panic->throw(
details => "Could not determine type for $table.$column",
);
unless ($type =~ /\Aenum\((.*)\)\z/) {
X::Internal::Database::IncorrectTypeForColumn->throw(
type_wanted => 'enum',
type_found => $type,
);
}
$type = $1;
require Text::CSV_XS;
my $csv = Text::CSV_XS->new;
$csv->parse($type) or X::Panic->throw(
details => "Could not parse enum CSV data: ".$csv->error_input,
);
return map { /\A'(.*)'\z/; $1 }$csv->fields;
}
Estamos utilizando DBIx::Class. Sin duda, hay una mejor manera de lograr esto? (Tenga en cuenta que la variable $ table proviene de nuestro código, , no desde cualquier fuente externa. Por lo tanto, no es un problema de seguridad).
Agradable :-). Alguien debería documentar eso en un lugar obvio sin embargo. –
Excelente. ¡Muchas gracias! – Ovid
FWIW, extraje esa respuesta de Rose :: DB :: Object, que introspecta y configura automáticamente las enumeraciones de MySQL, las columnas de matriz de Postgres y muchos otros tipos similares. Su código es una buena fuente de respuestas cuando DBD :: * docs se queda corto. –