【问题标题】:SQLite: Add columns on the fly if they don't existSQLite:如果它们不存在,则动态添加列
【发布时间】:2013-08-02 09:34:03
【问题描述】:
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 值)

【问题讨论】:

  • 为每个键发出 ALTER 语句。如果该列已存在,它将失败,如果不存在,它将创建该列。
  • 捕获故障(使用eval 或类似 Try::Tiny 之类的东西)并插入列也可以。
  • @ikegami - 为每一列执行改变,每次我想插入都会非常昂贵
  • 所以请跟踪您已经尝试过的。

标签: perl sqlite dbi


【解决方案1】:

根据您使用 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 很好,我编辑了它,现在它返回一个数组,你可以用它来 grep ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 2019-03-12
  • 2010-11-01
  • 2017-06-21
  • 2012-04-24
相关资源
最近更新 更多