我希望能够将某些内容传递给SQL查询,以确定是否只选择某个列为null的那些查询.如果我只是构建一个查询字符串而不是使用绑定变量,我会做类似的事情:
if ($search_undeleted_only)
{
$sqlString .= " AND deleted_on IS NULL";
}
Run Code Online (Sandbox Code Playgroud)
但我想使用绑定查询.这会是最好的方式吗?
my $stmt = $dbh->prepare(...
"AND (? = 0 OR deleted_on IS NULL) ");
$stmt->execute($search_undeleted_only);
Run Code Online (Sandbox Code Playgroud) 我对Devel :: Cover模块有点新,但发现它确保我没有错过测试非常有用.
我遇到的一个问题是了解Devel :: Cover的报告.我查看了文档,但无法弄清楚我需要测试什么才能获得100%的覆盖率.
编辑 - 我应该说清楚我并不是说我需要100%的覆盖率,因为正如多人指出的那样,100%覆盖率是一个宽松的术语,并不意味着我的代码没有错误,并且可能并不总是完全必要.由于我是Devel :: Cover的新手,我很想知道 为什么我的代码不是100%覆盖,以防我错过了一些重要的测试.
以下是封面报告的输出:
line err stmt bran cond sub pod time code
...
36 sub connect_database {
37 3 3 1 1126 my $self = shift;
38 3 100 24 if ( !$self->{dsn} ) {
39 1 7 croak 'dsn not supplied - cannot connect';
40 }
41 *** 2 33 21 $self->{dbh} = DBI->connect( $self->{dsn}, q{}, q{} )
42 || croak "$DBI::errstr";
43 1 11 return $self;
44 …Run Code Online (Sandbox Code Playgroud) 我正在使用Perl DBI.我知道$dbase->tables()将返回相应数据库中的所有表.同样,我想知道数据库中可用的模式.有没有可用的功能?
我有兴趣并行执行多个数据库操作.我玩过Perl Parallel :: ForkManager,但还没有用过任何数据库.我已经读过这个数据库连接不受支持.有任何人对此有经验吗?
作为一个例子,我可能会产生一个系统调用(它使DBI工作)不是原始代码,即
#!/opt/local/bin/perl -w
use strict;
use Parallel::ForkManager;
$| = 1;
my $max_procs = 10;
my $pm = new Parallel::ForkManager($max_procs);
for (my $var = 0; $var <= 10; $var++) {
my $pid = $pm->start('proc'.$var) and next;
sleep ( 2 );
system( "./DBworker.pl $var" );
$pm->finish(0);
}
print "Waiting for child procs\n";
$pm->wait_all_children;
print "complete!\n";
Run Code Online (Sandbox Code Playgroud) 我有一个最奇怪的问题,我对SQL的非常基本的知识必定是非常错误的,但我无法理解下面说明的行为.
我有这个文件 test.csv
id,field
A,0
B,1
C,2
D,"0"
E,"1"
F,"2"
G,
H,""
I," "
Run Code Online (Sandbox Code Playgroud)
而这个测试代码:
#! /usr/bin/perl
use strict;
use warnings;
use DBI;
use Devel::VersionDump qw(dump_versions);
my $dbh = DBI->connect ("dbi:CSV:");
$dbh->{RaiseError} = 1;
$dbh->{TraceLevel} = 0;
my $i = 0;
foreach my $cond ("TRUE",
"field <> 0 AND field <> 1",
"field = 0 OR field = 1",
"NOT (field = 0 OR field = 1)",
"NOT field = 0 OR field = 1",
"field <> 0",
"NOT field …Run Code Online (Sandbox Code Playgroud) 我使用简单的Perl脚本连接到Oracle 11g数据库时出现以下错误:
failed: ERROR OCIEnvNlsCreate. Check ORACLE_HOME (Linux) env var or PATH (Windows) and or NLS settings, permissions, etc. at
Run Code Online (Sandbox Code Playgroud)
脚本如下:
#!/usr/local/bin/perl
use strict;
use DBI;
if ($#ARGV < 3) {
print "Usage: perl testDbAccess.pl dataBaseUser dataBasePassword SID dataBasePort\n";
exit 0;
}
my ($user, $pwd, $sid, $port) = @ARGV;
my $host = `hostname`;
my $dbh;
my $sth;
my $dbname = "dbi:Oracle:HOST=$host;SID=$sid;PORT=$port";
openDbConnection();
closeDbConnection();
sub openDbConnection() {
$dbh = DBI->connect ($dbname, $user ,$pwd , { RaiseError => 1}) || die "Database …Run Code Online (Sandbox Code Playgroud) 我收录了宝石,
dbd-mysql (0.4.4)
dbi (0.4.5)
mysql (2.8.1)
Run Code Online (Sandbox Code Playgroud)
在我运行以下代码时在rails控制台上,
require 'rubygems'
require "dbi"
require 'dbd-mysql'
dbh = DBI.connect("DBI:Mysql:TestDB:localhost","username", "pwd")
1.9.2-p180 :001 > require 'rubygems'
=> false
1.9.2-p180 :002 > require "dbi"
=> false
1.9.2p180 :003 > require 'dbd-mysql'
LoadError: no such file to load -- dbd-mysql
from /.rvm/gems/ruby-1.9.2-p180@rails3/gems/dbi-0.4.5/lib/dbi.rb:318:in `rescue in load_driver'
from /.rvm/gems/ruby-1.9.2-p180@rails3/gems/dbi-0.4.5/lib/dbi.rb:242:in `load_driver'
from /.rvm/gems/ruby-1.9.2-p180@rails3/gems/dbi-0.4.5/lib/dbi.rb:160:in `_get_full_driver'
from /.rvm/gems/ruby-1.9.2-p180@rails3/gems/dbi-0.4.5/lib/dbi.rb:145:in `connect'
from (irb):3
from /.rvm/gems/ruby-1.9.2-p180@rails3/gems/railties-3.1.1/lib/rails/commands/console.rb:45:in `start'
from /.rvm/gems/ruby-1.9.2-p180@rails3/gems/railties-3.1.1/lib/rails/commands/console.rb:8:in `start'
from /.rvm/gems/ruby-1.9.2-p180@rails3/gems/railties-3.1.1/lib/rails/commands.rb:40:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
1.9.2-p180 :004 > …Run Code Online (Sandbox Code Playgroud) 我编写了一个示例Perl程序来从数据库表中删除数据.
这是我写的代码,
use DBI;
my $dbh = DBI->connect("DBI:Pg:host=192.168.12.23;port=5432;", "adhi");
if ( $dbh ) {
print "Connected successfully\n";
my $exe = $dbh->prepare("delete from perl_test.test");
my $res = $exe->execute();
if ( $res ) {
print "deleted the table successfully of rows: $res\n";
}
}
Run Code Online (Sandbox Code Playgroud)
如果我已执行上述操作,则应打印成功的消息,然后删除已删除的行数.
如果表是空的,则打印0E0而不是0.我不知道它是如何返回这样的值?
有人可以解释一下它是如何工作的吗?
下面是我在 R 中用于从 PostgreSQL 数据库中提取 ID 的代码片段。当我运行该函数时,我从 R 收到以下警告消息:
在 result_create(conn@ptr, statements) 中:关闭打开的结果集,取消之前的查询
options(warn=-1)如何避免出现此警告消息而不在代码开头 使用,抑制警告而不是
con <- dbConnect(RPostgres::Postgres(),
user = "postgres",
dbname = "DataBaseName",
password = "123456",
port = 5431)
get_id <- function(connection, table){
query <- toString(paste("SELECT id FROM ", table, sep = ""))
data_extract_query <- dbSendQuery(connection, query)
data_extract <- dbFetch(data_extract_query)
return(data_extract)
}
get_id(con, "users")
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过 R studio 使用 DBI:: dbAppendTable() 将数据帧插入到雪花数据库的表中。datafarme 中的行数为 5000。仅当我总共加载所有 5000 行时,才会出现上述错误。在表中插入 1024 行后查询失败。如果我使用循环加载大小为 100 的批次,它不会失败。我的字符串大小也不会超出 VARCHAR 列大小。我从未见过雪花出现此错误。希望有人对此有任何见解。
dbi ×10
perl ×7
r ×2
sql ×2
csv ×1
etl ×1
oracle ×1
postgresql ×1
rpostgresql ×1
ruby ×1
ruby-1.9.2 ×1
schema ×1
snowflake-cloud-data-platform ×1
testing ×1