我知道如何使用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);
然而,我遇到的问题是,我得到的参数是
无论如何,我想我的实际问题是,这可以让这不是静态的吗?
"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)
喜欢根据我从文本文件中读取的内容来定义我的插入语句(比如我们如何使用?因为我们还不知道这些值,我需要一种方法来使用?对于列,因为我不知道他们呢。
这可能吗?对不起,如果我不清楚,可以解释一下,如果你问。
答案 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 ( ?,?,? )
另见: