SQLite:如果列不存在,则动态添加列

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();
}

我有一个方法,它可以将哈希引用的内容插入到一个SQLite数据库的表中。我想知道是否有一种简单的方法,如果哈希键不是列名,则添加列到表中。显然,如果其中一个键不是列名,则插入将失败。我能否利用这个失败,添加缺失的列,并重新进行插入。还是每次想要插入数据库时,都必须检查所有列与所有键之间的关系?(所有键都具有TEXT值)


4
为每个键发出一条 ALTER 语句。如果该列已经存在,则操作将失败;如果不存在,则会创建该列。 - ikegami
捕获失败(使用eval或类似的Try::Tiny)并插入列也可以起作用。 - simbabque
@ikegami - 每次想要插入数据时都执行每个列的Alter操作将会非常昂贵。 - Takkun
1
因此,请跟踪您已经尝试过的内容。 - ikegami
1个回答

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的数组 ;)


$inf是数组引用的数组吗?我是否需要进行嵌套的foreach循环来比较列名?我希望只需使用grep(/column_name/, @list_of_columns)。 - Takkun
@Takkun 很好,我已经编辑过了,现在它会返回一个数组,你可以用来进行grep操作 ;) - chris-l

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接