首先,我想构建DBD :: mysql包.这种情况一直都是失败的,因为无论是什么样的结果都无法加载到测试中Symbol not found: _is_prefix.所以我认为cpan可能有点老了.我知道这是一个随机的假设,但cpan确实告诉我安装最新的Bundle :: CPAN.
谁成功安装了DBD :: mysql或Bundle::CPANMac OS X 10.5?你能推荐一些我可以做的不同的事吗?
This is perl, v5.8.8 built for darwin-thread-multi-2level (with 4 registered patches, see perl -V for more detail)
/usr/local/mysql/bin/mysql Ver 14.14 Distrib 5.1.36, for apple-darwin9.5.0 (i386) using readline 5.1
这是DBD :: mysql的CPAN输出日志:
Writing Makefile for DBD::mysql cc -c -I/Library/Perl/5.8.8/darwin-thread-multi-2level/auto/DBI -I/usr/local/mysql/include -DDBD_MYSQL_INSERT_ID_IS_GOOD -g -arch ppc -arch i386 -g -pipe -fno-common -DPERL_DARWIN -no-cpp-precomp -fno-strict-aliasing -Wdeclaration-after-statement -I/usr/local/include -O3 …
我目前正在使用perl模块DBI(1.613)和DBD :: Oracle(1.26)访问Oracle数据库版本9i(9.2.0.8.0).该项目的当前范围现在要求我访问版本8i(8.1.7.4.0)Oracle数据库,并且根据DBD :: Oracle项目,我只能访问具有DBD :: Oracle版本1.20的第二个数据库或下面.
我知道我可以使用DBD版本1.20访问这两个数据库,但我想知道是否可以安装两个版本的DBD模块并为每个数据库使用可接受的版本(不太容易出错).
我处理了很多文本文件,以"SQL方式"比较.
DBD::CSV显然是一个很好的选择,因为我可以在文本表上使用SQL语法的强大功能.但是,我处理大量的文本文件,DBD::CSV在性能方面毫无用处.
所以,我开始编写一个将csv文件转换为sqlite DB的模块,然后返回DBI::sqlite我可以使用的对象.问题是,将文本文件转换为sqlite表也可能效率不高,因为我无法从perl运行sqlite命令行来快速加载CSV文件(使用.load).所以我必须Insert into根据文本表创建一个巨大的字符串,并执行它(逐行执行插入在性能方面是非常低效的,所以我更喜欢执行一个大的插入).我愿意避免这种情况,寻找一个使用perl将csv加载到sqlite的单行程序.
另外,我使用以下函数来执行和打印SQL查询:
sub sql_command {
my ($self,$str) = @_;
my $s = $self->{_db}->prepare($str) or die $!;
$s->execute() or die $!;
my $table;
push @$table, [ map { defined $_ ? $_ : "undef" } @{$s->{'NAME'}}];
while(my $row = $s->fetch) {
push @$table, [ map{ defined $_ ? $_ : "undef" }@$row ];
}
box_format($table);
return box_format($table);;
}
sub box_format {
my $table = shift;
my $n_cols = scalar @{$table->[0]}; …Run Code Online (Sandbox Code Playgroud) 我在MySQL中有一个包含撇号(’)和省略号(...)的值:
$ /bin/echo "select alias from url_alias where source = 'node/12024'" | \
mysql --skip-column-names -D cat36ia_d7prod
Run Code Online (Sandbox Code Playgroud)
输出:
forum/technical-discussion/nagging-questions-i’ve-been-too-embarrassed-ask…
Run Code Online (Sandbox Code Playgroud)
当我检索用Perl值DBI和DBD::mysql,该值已经改变:
$ perl -MDBI -MDBD::mysql -e
'$dbh=DBI->connect( "DBI:mysql:database=my_db",nick );
$v=$dbh->selectrow_array(qq|select alias from url_alias where source = "'node/12024'"|);
print "$v\n";'
Run Code Online (Sandbox Code Playgroud)
输出:
forum/technical-discussion/nagging-questions-i?ve-been-too-embarrassed-ask?
Run Code Online (Sandbox Code Playgroud)
为什么Perl这样做?我可以覆盖它吗?
我正在使用的外部Perl库有一个我不会在我的应用程序中使用的依赖项(DBD :: mysql)(DBD :: SQLite),所以我希望系统只是假装依赖存在,即使它是假的".
我可以创建一个空的DBD :: mysql.pm模块来编译或者有更简单的方法吗?
有人可以告诉我为什么我在下面的代码中打开文件时出错.错误从25个线程的第9次迭代的大约一半开始,并且是"太多打开文件"错误.该错误仅在线程中运行时发生,并且仅在使用DBI连接/断开连接时发生.这应该不应该影响打开文件数应该是什么呢?我对Perl很新,所以不确定我是否做了一些奇怪的事情.这是在Perl 5.8.8上.在Solaris 10上.
use threads ();
use DBI;
use DBD::Oracle;
my $thrds=25;
my $iter=10;
my @threads;
for (my $j=0; $j<$iter; $j++) {
&start($j);
}
sub start {
my $k=$_[0];
for (my $i=0; $i<$thrds; $i++) {
$threads[$i] = threads->new(\&RunThread,$k, $i);
}
for (my $i=0; $i<$thrds; $i++) { $threads[$i]->join; }
}
sub RunThread {
my $dbh = DBI->connect("dbi:Oracle:lnrmsd9.world", "rms_reader", "rms_reader") or die "failed connect";
my ($x, $y)=@_;
open (my $fh, ">/tmp/da") or die "failed $! at iter $x thread $y";
close ($fh); …Run Code Online (Sandbox Code Playgroud) 每当我尝试构建DBD::Sybase连接到MSSQL时,我都会收到错误,
$ sudo cpanp install DBD::Sybase
Installing DBD::Sybase (1.15)
Running [/usr/bin/perl /usr/bin/cpanp-run-perl /home/ecarroll/.cpanplus/5.14.2/build/DBD-Sybase-1.15/Makefile.PL INSTALLDIRS=site]...
Can't find any Sybase libraries in /etc/lib or /etc/lib64 at /home/ecarroll/.cpanplus/5.14.2/build/DBD-Sybase-1.15/Makefile.PL line 155, <IN> line 44.
BEGIN failed--compilation aborted at /usr/bin/cpanp-run-perl line 11, <IN> line 44.
[ERROR] Could not run '/usr/bin/perl Makefile.PL': Can't find any Sybase libraries in /etc/lib or /etc/lib64 at /home/ecarroll/.cpanplus/5.14.2/build/DBD-Sybase-1.15/Makefile.PL line 155, <IN> line 44.
BEGIN failed--compilation aborted at /usr/bin/cpanp-run-perl line 11, <IN> line 44.
-- cannot continue
[ERROR] Unable to …Run Code Online (Sandbox Code Playgroud) 我无法在 macOS Big Sur 11.2.1 上构建和安装Oracle Instant Client 19.8。我收到以下错误:
Error: Can't load '/Users/x/.cpanm/work/1613898291.17798/DBD-Oracle-1.80/blib/arch/auto/DBD/Oracle/Oracle.bundle' for module DBD::Oracle: dlopen(/Users/x/.cpanm/work/1613898291.17798/DBD-Oracle-1.80/blib/arch/auto/DBD/Oracle/Oracle.bundle, 0x0002): dependent dylib '@rpath/libclntsh.dylib.19.1' not found for '/Users/x/.cpanm/work/1613898291.17798/DBD-Oracle-1.80/blib/arch/auto/DBD/Oracle/Oracle.bundle'. relative file paths not allowed '@rpath/libclntsh.dylib.19.1' at /System/Library/Perl/5.28/darwin-thread-multi-2level/DynaLoader.pm line 197.
Run Code Online (Sandbox Code Playgroud)
Big Sur 似乎没有将DYLD_LIBRARY_PATH环境变量传递给子 shell:
Your DYLD_LIBRARY_PATH env var is set to ''
WARNING: Your DYLD_LIBRARY_PATH env var doesn't include '/opt/instantclient_19_8' but probably needs to.
Run Code Online (Sandbox Code Playgroud)
我努力了:
~/Downloads/instantclient_19_8~/lib或/usr/local/libinstall_name_tool修改id并更改@rpath但得到warning: changes …我正在使用以下 DBD::mysql 语句连接到 MySQL 数据库:
use DBI;
# Connect to the database.
my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost",
"usr", "usr's password",
{'RaiseError' => 1});
Run Code Online (Sandbox Code Playgroud)
在尝试连接数据库之前,有没有办法检查 MySQL 服务是否正在运行?如果数据库运行在远程服务器上怎么办?
我必须将/oracle/v10.2.0/lib添加到LD_LIBRARY_PATH以使用DBI模块连接到Oracle.
如果我在执行perl脚本之前在shell中设置LD_LIBRARY_PATH,一切正常.
但它不适用于脚本:
BEGIN {
$ENV{'LD_LIBRARY_PATH'}='/oracle/v10.2.0/lib';
}
use DBI;
Run Code Online (Sandbox Code Playgroud)
当我执行脚本时,我收到错误:
install_driver(Oracle)失败:无法为模块DBD :: Oracle加载'/usr/apps/perl5/site_perl/5.8.8/i686-linux/auto/DBD/Oracle/Oracle.so':libclntsh.so.10.1 :无法打开共享对象文件:/usr/apps/perl5/5.8.8/i686-linux/DynaLoader.pm第230行没有这样的文件或目录.在(eval 3)第3行编译在(eval 3)的require中失败第3行.也许未安装在/var/tmp/getTraceDB.pl第23行所需的共享库或dll
dbd ×10
perl ×10
dbi ×4
oracle ×4
mysql ×3
macos ×2
dependencies ×1
escaping ×1
freetds ×1
osx-tiger ×1
perl-module ×1
sql-server ×1
sqlite ×1
sybase ×1