我有一些代碼需要確保一些數據在插入到數據庫之前在mysql枚舉中。我發現這樣做的最徹底的方法是將下面的代碼:如何在Perl中乾淨地提取MySQL枚舉值?
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;
}
我們使用DBIx::Class。當然有更好的方法來完成這個? (請注意,$ table變量來自我們的代碼,而不是來自任何外部來源的,因此沒有安全問題)。
我們確實有非常嚴格的限制,我們試圖按照命名約定進行操作,所以看起來像一個很好的簡化。謝謝! – Ovid 2008-10-23 10:59:18
雖然有一個小小的修正:它將在枚舉中處理逗號,但它不會處理撇號。 – 2008-10-23 11:31:18