2013-08-01 75 views
3
sub insert { 
    my ($self) = @_; 
    my $data = $self->{data}; 
    my $keys = join(', ', keys $data); 
    my $values = join(', ', map qq('$_'), values $data); 
    my $sql = "INSERT INTO tbl ($keys) VALUES ($values);"; 
    my $sth = $self->{dbh}->prepare($sql); 
    $sth->execute(); 
} 

我有一個方法將hash ref的內容插入到一個表sqlite數據庫中。我想知道是否有一個簡單的方法來添加一列到表中,如果散列鍵不是列。顯然,如果其中一個鍵不是列名,插入將失敗。我可以利用這種失敗,添加缺失的列,並重新插入。或者每次我想插入數據庫時​​,是否必須檢查所有列的所有列? (所有按鍵都TEXT值)SQLite:如果它們不存在,立即添加列

+4

問題的ALTER語句爲每個鍵。如果列已經存在,它會失敗,否則它會創建列。 – ikegami

+0

捕捉失敗(使用'eval'或類似Try :: Tiny的東西)並插入列也會起作用。 – simbabque

+0

@ikegami - 爲每一個列執行修改,每一次我想要插入的代碼都會非常昂貴 – Takkun

回答

2

改變基礎上,信息的表,你開始使用PRAGMA

my $inf_query = $db->prepare("PRAGMA table_info('tbl')"); 
$inf_query->execute(); 
my @inf = map { $_->[1] } @{$inf_query->fetchall_arrayref()}; 

@inf將包含表中存在的那些列,您可以使用這些信息來構建您的ALTER查詢。

編輯返回,您可以使用到grep數組;)

+0

$ inf是數組的數組嗎?我必須做一個嵌套的foreach循環來比較列名嗎?我很想grep(/ column_name /,@list_of_columns) – Takkun

+0

@Takkun很好,我編輯它,現在它返回一個數組,你可以使用grep;) –

相關問題