Ich habe etwas Code, der sicherstellen muss, dass einige Daten in einer Mysql-Enumeration vor dem Einfügen in der Datenbank sind. Die sauberste Art, wie ich dies zu tun gefunden habe, ist der folgende Code:Wie extrahiere ich sauber MySQL Enum-Werte in 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;
}
Wir DBIx::Class verwenden. Sicherlich gibt es einen besseren Weg, dies zu erreichen? (Beachten Sie, dass die $ table-Variable von unserem Code kommt, nicht von einer externen Quelle. Daher kein Sicherheitsproblem).
Schön :-). Jemand sollte das an einem offensichtlichen Ort dokumentieren. –
Ausgezeichnet. Vielen Dank! – Ovid
FWIW, ich habe diese Antwort aus Rose :: DB :: Object herausgezogen, die MySQL-Enums, Postgres-Array-Spalten und viele andere solche Typen untersucht und automatisch konfiguriert. Sein Code ist eine gute Quelle für Antworten, wenn die DBD :: * -Dokumente nicht ausreichen. –