gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:39:58 25 4
gpt4 key购买 nike

我知道如何使用 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) 

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

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

最佳答案

您走在正确的轨道上。您需要动态构建查询。对列名使用变量插值是完全没问题的。您不应该直接使用 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 ( ?,?,? )

另见:

关于mysql - 如何在 Perl 中构建具有灵活列数的动态 MySQL INSERT 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31813394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com