gpt4 book ai didi

perl - 我可以使用 Perl 的 DBI 从 SQL 查询中获取表名吗?

转载 作者:行者123 更新时间:2023-12-02 12:56:38 24 4
gpt4 key购买 nike

我正在用 Perl 和 DBI 编写小片段(SQLite 耶!)

我想将一些特定查询记录到与运行查询的表名具有相同文件名的文本文件中。

这是我用来将结果转储到文本文件的代码:

sub dumpResultsToFile {
my ( $query ) = @_;

# Prepare and execute the query
my $sth = $dbh->prepare( $query );
$sth->execute();

# Open the output file
open FILE, ">results.txt" or die "Can't open results output file: $!";

# Dump the formatted results to the file
$sth->dump_results( 80, "\n", ", ", \*FILE );

# Close the output file
close FILE or die "Error closing result file: $!\n";
}

我可以这样调用它:

dumpResultsToFile ( <<"    END_SQL" );
SELECT TADA.fileName, TADA.labelName
FROM TADA
END_SQL

我实际上想要的是,现在应该转到“TADA.txt”,而不是转到“results.txt”(上面硬编码的)。

如果这是表“HAI”和“LOL”之间的联接,则结果集应写入“HAI.LOL.txt”

我所说的甚至可以在 DBI 中使用一些魔法吗?

我宁愿不解析表的 SQL 查询,但如果有一个广泛使用和调试的函数来获取 SQL 查询中的表名称,那也对我有用。

我想要的只是一个文件名这给出了一些关于什么查询的提示它保存的输出。分离依据表名目前看来是一个不错的方法。

最佳答案

可能不是。您的 SQL 生成代码采用了错误的方法。您从程序中隐藏了太多信息。在某些时候,您的程序知道要从哪个表中选择。您不应该丢弃该信息并将其嵌入不透明的 SQL 命令中,而应该保留它。那么你的记录器函数就不必猜测日志数据应该去哪里;它知道

也许通过一些代码会更清楚。您的代码如下所示:

sub make_query {
my ($table, $columns, $conditions) = @_;
return "SELECT $columns FROM $table WHERE $conditions";
}

sub run_query {
my ($query) = @_;
$dbh->prepare($query);
...
}

run_query( make_query( 'foo', '*', '1=1' ) );

这不会让你做你想做的事。所以你应该构建你的程序要做类似的事情:

sub make_query {
my ($table, $columns, $conditions) = @_;
return +{
query => "SELECT $columns FROM $table WHERE $conditions",
table => $table,
} # an object might not be a bad idea
}

sub run_query {
my ($query) = @_;

$dbh->prepare($query->{query});
log_to_file( $query->{table}.'.log', ... );

...
}

run_query( make_query( 'foo', '*', '1=1' ) );

API 是相同的,但现在您拥有了登录所需的信息你想要的方式。

另外,请考虑SQL::Abstract用于动态 SQL 生成。我的代码以上只是一个例子。

编辑:好的,所以你说你正在使用 SQLite。它有一个 EXPLAIN 命令您可以解析以下输出:

sqlite> explain select * from test;
0|Trace|0|0|0|explain select * from test;|00|
1|Goto|0|11|0||00|
2|SetNumColumns|0|2|0||00|
3|OpenRead|0|2|0||00|
4|Rewind|0|9|0||00|
5|Column|0|0|1||00|
6|Column|0|1|2||00|
7|ResultRow|1|2|0||00|
8|Next|0|5|0||00|
9|Close|0|0|0||00|
10|Halt|0|0|0||00|
11|Transaction|0|0|0||00|
12|VerifyCookie|0|1|0||00|
13|TableLock|0|2|0|test|00|
14|Goto|0|2|0||00|

看起来 TableLock 就是您想要寻找的。嗯嗯,这个这是一个坏主意。

关于perl - 我可以使用 Perl 的 DBI 从 SQL 查询中获取表名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1584893/

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