我试图让DBD :: MySQL在Snow Leopard上工作(v10.6.6).操作系统附带的默认Perl版本是v5.10.0.由于我已经阅读了64位,我继续下载并安装了64位版本的MySQL(mysql-5.5.8-osx10.6-x86_64).
安装和设置MySQL顺利进行,这是我的配置和版本号供参考.
我使用CPAN下载DBI和DBD :: MySQL驱动程序.然后我:
Makefile.PL表示它将使用以下设置进行编译和测试:
I will use the following settings for compiling and testing: cflags (mysql_config ) = -I/usr/local/mysql/include -Os -g -fno-common -fno-strict-aliasing -arch x86_64 embedded (mysql_config ) = libs (mysql_config ) = -L/usr/local/mysql/lib -lmysqlclient -lpthread mysql_config (guessed ) = mysql_config nocatchstderr (default ) = 0 nofoundrows (default ) = 0 ssl (guessed ) = 0 testdb (default ) = test testhost (default ) = testpassword (User's choice) …
我正在使用perl脚本从我的数据库中提取网址,我使用fetchrow_array从数据库中提取URL工作正常,直到我遇到一个很长的URL,georgelog24.blog.iskreni.net/?bid=6744d9dcf85991ed2e4b8a258153a1ab&lid=ff9963b9a798ea335b75b5f7c0c295d1
然后它开始给我这个错误.
DBD::ODBC::st fetchrow_array failed: st_fetch/SQLFetch (long truncated DBI attribute LongTruncOk not set and/or LongReadLen too small) (SQL-HY000) [state was HY000 now 01004]
[Microsoft][ODBC SQL Server Driver]String data, right truncation (SQL-01004) at C:\test\multihashtest2.pl line 44.
Run Code Online (Sandbox Code Playgroud)
我相信这是在数据库方面,因为我以前用来拉URL的代码已经运行了.我使用的数据库是MSSQL server 2005.
数据库中的URL列当前使用文本类型,但我已尝试将其更改为varchar(max)和nvarchar(max),但错误仍然存在.
经过一些试验和错误,我发现网址的最大长度,然后我可以成功查询fetchrow_array是81个字符.由于URL有时会跨越荒谬的长度,我不能对URL长度施加限制.
任何人都可以帮助我理解并建议解决此问题吗?
仅供参考:第44行是我下面代码中的第一行
while (($myid,$url) = $statement_handle->fetchrow_array()) { # executes as many threads as there are jobs to do
my $thread = threads->create(\&webcrawl); #initiate thread
my $tid = $thread->tid;
print " …Run Code Online (Sandbox Code Playgroud) 我想插入null表中的列.
哪一个代表null?undef或空字符串''.
应该使用哪一个,为什么?我知道defined并且我可以检查它.
但我从数据库的角度来看更多.
哪一个null更恰当?
更新:我正在使用DBI模块.
升级到OSX Mavericks后,我无法运行DBI/DBD.
Perl和MySQL运行正常(我可以登录到mysql并访问我的表),但我的Perl脚本不再使用DBI,因为更新程序删除了我以前工作的所有Perl模块.
我使用CPAN重新安装了DBI和DBD :: mysql,它们将它们安装到/opt/local/lib/perl5/site_perl/5.12.4/darwin-multi-2level/.将模块(DBI,DBD和"auto"中的所有内容)复制到/Library/Perl/5.16/darwin-multi-2level/(因为cpan使用的目录不在@INC中)后,我的脚本返回内部服务器错误(甚至使用FatalsToBrowser).
Apache错误日志说:
dyld: lazy symbol binding failed: Symbol not found: _Perl_Istack_sp_ptr
Referenced from: /opt/local/lib/perl5/site_perl/5.12.4/darwin-multi-2level/auto/DBI/DBI.bundle
Expected in: flat namespace
dyld: Symbol not found: _Perl_Istack_sp_ptr
Referenced from: /opt/local/lib/perl5/site_perl/5.12.4/darwin-multi-2level/auto/DBI/DBI.bundle
Expected in: flat namespace
Premature end of script headers: test.pl
Run Code Online (Sandbox Code Playgroud)
这有什么问题?也许是因为我复制了文件?也许我应该强制CPAN直接安装到/Library/Perl/5.16/?我如何告诉CPAN这样做?
有任何想法吗?
当我将perl环境从5.16.0切换到5.24.0时,我得到了一个我无法理解的奇怪行为.这段代码
use DBI;
my $conn = 'dbi:ODBC:sqlserver_xxxx';
my $userid = 'dw_select';
my $passwd = 'xxxx';
for ( 1 .. 100 ) {
warn "start try $_";
my $dbh = DBI->connect($conn, $userid, $passwd, { RaiseError => 1 } );
warn "end try $_";
}
Run Code Online (Sandbox Code Playgroud)
在5.16.0上运行正常,但当切换到5.24.0时,我得到以下结果:
start try 1 at test_con.pl line 9.
end try 1 at test_con.pl line 11.
start try 2 at test_con.pl line 9.
end try 2 at test_con.pl line 11.
start try 3 at test_con.pl line 9.
DBI …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的Perl 6预算应用程序设计一个"数据访问层".目标是让用户在SQLite数据库中存储各种购买,我的应用程序将生成各种报告,通知用户消费习惯.
但是,我在做一个"正确"的数据访问层时遇到了麻烦.事实上,我想知道这个应用程序是否值得.无论如何,我想学习如何正确地设计它"面向对象".
我理解我希望我的类成为表,并且类的属性对应于表中的行.就目前而言,我的代码根本不使用类属性,但仍然可以正常工作.
是否有任何理由使用类属性?我查了几个资源,其中大部分都是Java,我很难翻译成Perl 6.看起来不必要复杂,但我怀疑这是因为我不明白这个设计模式的原因.
1 #!/usr/bin/env perl6
2
3 use v6;
4 use DBIish;
5
6 constant DB = 'budgetpro.sqlite3';
7 my $dbh = DBIish.connect('SQLite', database => DB);
8
9 $dbh.do('drop table if exists Essential');
10
11 sub create-schema {
12 $dbh.do(qq:to/SCHEMA/);
13 create table if not exists Essential(
14 id integer primary key not null,
15 name varchar not null,
16 price numeric(5,2) not null,
17 quant integer not null,
18 desc varchar not null, …Run Code Online (Sandbox Code Playgroud) 当使用Perl DBD :: SQLite时,SQLite是否存在已知问题,在单个事务中为第二个查询提供"数据库已锁定"错误?场景:Linux,Perl DBI,AutoCommit => 0,一个带有两个代码块的子例程(使用块来本地化变量名).在第一个代码块中,一个查询句柄由select()在select语句中创建,它被执行()并且块被关闭.第二个代码块是通过准备更新语句创建的另一个查询句柄,并且经常(30%的时间)SQLite/DBI在此阶段给出数据库锁定错误.我认为错误发生在prepare()期间而不是在execute()期间.
我的工作是在第一次查询后提交.(在第一个查询上调用完成没有帮助).我不喜欢有几个与优雅和表现有关的理由.Postgres作为数据库,原始代码已经运行了很多年.我试过sqlite_use_immediate_transaction没有效果.
在所有其他情况下,我发现SQLite表现得非常好,所以我怀疑这是DBD驱动程序中的疏忽,而不是SQLite的问题.遗憾的是,我目前的代码是一大堆脚本和模块,所以我没有一个简短的单个文件测试用例.
有DBI没有办法确定SELECT语句的执行语句句柄是否将返回任何行而不从中获取?
就像这样:
use DBI;
...
my $sth = $dbh->prepare("SELECT ...");
$sth->execute;
if (..$sth will return at least one row...) {
...
} else {
...
}
Run Code Online (Sandbox Code Playgroud)
我想在$sth will return at least one row 不执行任何获取方法的情况下执行测试$sth.
注意 - 我不需要精确的行数(即$sth->rows),我只需要知道是否$sth->rows> 0.
我需要能够在DBI上发出"创建触发器".我似乎无法让delimiter命令工作.任何人都可以找到一种方法来使这项工作?
码:
use strict;
use DBI;
my $dbargs = {mysql_auto_reconnect => 1,
AutoCommit => 0,
RaiseError => 1,
ShowErrorStatement => 1};
my $dsn = "DBI:mysql:database=xdisp;host=cycldev06";
my $dbh = DBI->connect( $dsn, 'sqluser', '', $dbargs);
my $sql = qq{
DELIMITER //
CREATE TRIGGER `hardware_last_status` BEFORE UPDATE
ON `hardware` FOR EACH ROW BEGIN
IF NEW.status != OLD.status AND NEW.last_status = OLD.last_status THEN
SET NEW.last_status = OLD.status;
END IF;
END
//
};
$dbh->do($sql);
Run Code Online (Sandbox Code Playgroud)
结果:
DBD::mysql::db do failed: You have an error in your SQL …Run Code Online (Sandbox Code Playgroud) 我越来越:
"Use of uninitialized value in join or string at ./test_script.pl line 69, <fh> line 91."
Run Code Online (Sandbox Code Playgroud)
创建此警告的代码如下:
# Write results of SQL execution to output file
if ($@) { print "\n DB Error : ", $@; exit; }
open(FH, ">$output_file") or
die "\n cannot write to the file $output_file. Check the file permissions";
while(my @row= $sth->fetchrow_array) {
print FH join($delimiter, @row). "\n";
}
Run Code Online (Sandbox Code Playgroud)
它来自"while"块中的"print ... join ...."行,但我不确定100%是由什么引起它以及如何纠正它.
$ delimiter先前初始化$ delimiter ="|" 并且@row从前一行的$ sth操作中获取其值.
这是关于@row值的"时间"问题还是正在处理的实际SQL查询文件中的某些内容,如警告的"<fh>第91行"部分所示?关于如何避免警告的任何想法?顺便说一下,脚本工作正常,它只是为每个获取的@row值生成一个警告,这会在大数据集拉动时产生大量警告......