Tôi có một số mã cần đảm bảo một số dữ liệu nằm trong một ens mysql trước khi chèn vào cơ sở dữ liệu. Cách sạch nhất mà tôi đã tìm thấy để thực hiện việc này là mã sau:Làm cách nào để trích xuất các giá trị enum của MySQL trong 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;
}
Chúng tôi đang sử dụng DBIx::Class. Chắc chắn có một cách tốt hơn để hoàn thành điều này? (Lưu ý rằng biến $ table đến từ mã của chúng tôi, không phải là từ bất kỳ nguồn bên ngoài nào. Do đó, không có vấn đề bảo mật).
Đẹp :-). Một người nào đó nên tài liệu đó ở một nơi rõ ràng mặc dù. –
Tuyệt vời. Cảm ơn nhiều! – Ovid
FWIW, tôi lấy câu trả lời đó ra khỏi Rose :: DB :: Object, nó sẽ tự động tìm kiếm và cấu hình các lược đồ MySQL, các cột mảng Postgres và nhiều loại khác như vậy. Mã của nó là một nguồn giải đáp tốt khi các tài liệu DBD :: * không hoạt động. –