如何在Perl中构建具有灵活列数的动态MySQL INSERT语句?

时间:2015-08-04 15:31:48

标签: mysql perl insert

我知道如何使用perl进行基本插入到mysql中,我不确定这个问题的完整性是否准确。

我想做的是如下: - 我得到一个带有一些参数的文本文件

"COUNTER","DATE","TIME","ACCEL LAT","ACCEL LONG","ACCEL VERT"

^作为例子。然后我得到了这些的csv值。

为此您只需执行以下操作:

$query = "insert into table(counter, date, time, accel_lat, accel_long, accel_vert) 
            values (?, ?, ?, ?, ?, ?) ";

$statement = $connection->prepare($query);

$statement->execute(MY DATA IN HERE);

然而,我遇到的问题是,我得到的参数是

  • a)mysql表中的一个子集(从1到全部的任意数量)
  • b)以文本文件中的随机顺序给出
  • c)与表中的列名不同(我想我需要构建一个数据字典,说明哪一个=什么)

无论如何,我想我的实际问题是,这可以让这不是静态的吗?

"insert into table(counter, date, time, accel_lat, accel_long, accel_vert) 

所以说我的参数文件是:date,time,counter,accel_vert

我可以将声明变成

"insert into table(date, time, counter, accel_vert) 

喜欢根据我从文本文件中读取的内容来定义我的插入语句(比如我们如何使用?因为我们还不知道这些值,我需要一种方法来使用?对于列,因为我不知道他们呢。

这可能吗?对不起,如果我不清楚,可以解释一下,如果你问。

1 个答案:

答案 0 :(得分:4)

你走在正确的轨道上。您需要动态构建查询。对列名称使用变量插值是完全正确的。您不应该直接使用CSV列中的那些。你对字典的想法是现实的。

我写了一个简单的例子。诀窍是在SQL中拥有正确数量的占位符?x repetition operator对此非常有用。

use strict;
use warnings;
use Text::CSV;
use DBI;

my $dbh = DBI->connect(...);

# csv => mysql
my %column_mapping = (
    qux => 'Qux',
    foo => 'Foo',
    bar => 'Bar',
    baz => 'Baz',
);

my $csv = Text::CSV->new or die "Cannot use CSV: " . Text::CSV->error_diag();

# get the headline
my $headers = $csv->getline( \*DATA );

# build the INSERT query based on those column headers
my $sql = sprintf 'INSERT INTO tablename ( %s ) VALUES ( %s )',
    join( ',', map { $column_mapping{$_} } @$headers ),
    join( ',', ('?') x scalar @$headers );   # note the list around the '?'

my $sth = $dbh->prepare($sql);

while ( my $row = $csv->getline( \*DATA ) ) {
    $sth->execute( @$row ) or die $dbh->errstr;
}

__DATA__
foo,bar,baz
1,2,3
5,5,5

在我的示例中,$sql具有此值:

INSERT INTO tablename ( Foo,Bar,Baz ) VALUES ( ?,?,? )

另见: