2013-03-18 3 views
2

DBIx::Class을 사용하여 MySQL 데이터베이스에 액세스하는 Catalyst 응용 프로그램을 개발 중입니다. 응용 프로그램은 파일에 대한 데이터 품질 검사를 수행합니다. 나는 각 열의 검증 작업을 정의하는 다른 테이블, Format, 한 다음DBIx :: Class :: ResultSet의 열 이름 추상화

FILE_ID LINE_NUMBER FOO BAR BAZ 
----------------------------------- 
1  1   A 99 Blah 
1  2   B 11 Blargh 
1  3   A 4 Sproing 
1  4   B 7 Sproing 
1  5   B 10 Doink 

:

COL_ORDER COL_NAME VALIDATION 
1   FOO  regex:/^[AB]$/ 
2   BAR  unique_number 
3   BAZ  regex:/\S/ 

내가하고 싶은 것은 FileContent 라인을 통해 이동 인 파일은 테이블 FileContent에로드 각 라인에 Format에 모든 규칙을 적용 주어진 파일의 라인에 의해 그러나

my @lines = $c->model('DB::FileContent')->search({file_id => 1}); 
my @format = $c->model('DB::Format')->search(); 

foreach my $line (@lines) 
{ 
    foreach my $column (@format) 
    { 
     #Get the field matching this column from $line. 
     #e.g. for first $column get $line->foo() 
    } 
} 

, 난 형식의 현재 열과 일치하는 행에서 열을 효율적으로 가져 오는 것이 가장 좋은 방법인지 확인하십시오. 열을 액세스하는 일반적인 방법은 $line->foo과 같은 메서드를 사용하는 것입니다. 그러나 foo이 변수 일 때 나는 무엇을해야합니까?

나는 이렇게 할 생각하지 않습니다

eval "$line->${$column->col_name}"; 

내가 get_column 알고있다, 그러나 이것은 행에서 단일 값을 얻기위한 효율적인가요?

$line->get_column($column->col_name) 

다른 표의 값을 기준으로 열을 검색하는 가장 효율적인 방법은 무엇입니까? 열 이름이나 열 위치를 사용할 수 있습니다. 귀하의 도움에 미리 감사드립니다.

+0

나에게 이해가되지 않습니다 검증을위한 관계형 데이터베이스로 파일 가져 오기. 웹 애플리케이션 프레임 워크를 사용하여이를 수행하지 마십시오. 문제를 해결하기 위해 DBIx :: Class와 Catalyst를 선택한 이유를 좀 더 설명 할 수 있습니까? –

+0

@abraxxa, 많은 다른 사용자가 데이터 파일을 시스템에 제출해야합니다. 응용 프로그램은 파일을 점검하고 오류를 정정 할 수 있도록 오류 보고서를 제공합니다. 또한 일부 변환을 수행합니다. 파일이 올 바르면 중앙 데이터베이스에 제출합니다. 파일은 데이터베이스에로드 될 CSV 파일이므로 관계형 데이터베이스는 논리적 인 스토리지 선택과 같습니다. –

답변

2

먼저 모든 유효성 검사 규칙을 해시ref (또는 해시)에 넣고, 가장 중요한 것은 FileContent 항목이 DBIx::Class::ResultClass::HashRefInflator을 통해 해시 참조로 부 풀려 있는지 확인하십시오. 이렇게하면 항목을 탐색 할 때 항목 내의 필드에 훨씬 더 편리하게 액세스 할 수 있습니다. 이처럼

:

#------------------------------------------------------------------------------------------ 
# get all formats into a hashref 
#------------------------------------------------------------------------------------------ 

my $format = $c->model('DB::Format')->search({}, { order_by => ['COL_ORDER'] }); 
my @col_names = $format->get_column('COL_NAME')->all; 
# @col_names now contains qw/FOO BAR BAZ/ 

my $formats; 
@{$formats}{@col_names} = $format->get_column('VALIDATION')->all; 

#------------------------------------------------------------------------------------------ 
# create an iterator over DB::FileContent, and make items inflate to hashrefs 
#------------------------------------------------------------------------------------------ 

my $file_content = $c->model('DB::FileContent')->search({file_id => 1}); 
$file_content->result_class('DBIx::Class::ResultClass::HashRefInflator'); 
# this ensures that every item inflates into a hashref 


# this way you can iterate over items, and don't have to put them all into an array 
while (my $hashref = $file_content->next) { 
    # put relevant field values into an array 
    my @values = @{$hashref}{@col_names}; 
} 
+0

이 접근법은 갈 길과 같습니다. 대답 할 시간을내어 주셔서 감사합니다. –