请考虑下表:
mysql> select * from vCountryStatus;
+-------------+------------+------+---------+--------+-----------------+
| CountryName | CountryISO | Code | Status | Symbol | CurrencyName |
+-------------+------------+------+---------+--------+-----------------+
| Brazil | BR | 55 | LIVE | BRL | Brazilian Real |
| France | FR | 33 | offline | EUR | Euro |
| Philippines | PH | 63 | LIVE | PHP | Philippino Peso |
+-------------+------------+------+---------+--------+-----------------+
3 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
我正在尝试基于此表构造哈希.为此我做了以下事情:
#!/usr/bin/perl
use DBI;
use Data::Dumper;
my $dbh = DBI->connect("dbi:mysql:database=db", "user", …Run Code Online (Sandbox Code Playgroud) 我在perl脚本中遇到了一些内存泄漏问题,我正在运行很长一段时间,其中perl占用的内存量正在继续增长.因此,我试图使用Devel :: Leak来追踪泄漏.我发现每当我调用DBI的prepare方法时,返回的标量值的数量Devel::Leak就会增加一个.下面是我测试的脚本,我把它放在一起做我正在描述的内容:
#!/usr/bin/perl
use strict;
use Devel::Leak;
use DBI;
START:
my $handle; # apparently this doesn't need to be anything at all
my $leaveCount = 0;
my $enterCount = Devel::Leak::NoteSV($handle);
print "ENTER: $enterCount SVs\n";
{
# CONFIG VARIABLES
my $platform = "mysql";
my $database = "db";
my $host = "localhost";
my $port = "3306";
my $user = "user";
my $pw = "pass";
#DATA SOURCE NAME
my $dsn = "dbi:mysql:$database:$host:3306";
# PERL …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用DBI和连接SSL客户端密钥DBD::Pg.
use strict;
use warnings 'all';
use DBI;
my $dsn = "dbi:Pg:db=mydb;sslmode=require;host=localhost;"
."sslcert=C:\\path with\\spaces.crt;"
."sslkey=C:\\path with\\spaces.key";
my $dbh = DBI->connect( $dsn, 'username', '' );
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Can't connect to database: missing "=" after "with\spaces.crt" in connection info string!
Run Code Online (Sandbox Code Playgroud)
我试过在值周围使用单引号或双引号无效,我在文档中找不到任何内容.
单引号如下:
my $dsn = "dbi:Pg:db=mydb;sslmode=require;host=localhost;"
."sslcert='C:\\path with\\spaces.crt';"
."sslkey='C:\\path with\\spaces.key'";
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
failed: FATAL: connection requires a valid client certificate
Run Code Online (Sandbox Code Playgroud)
我知道这个配置有效,因为它适用于Python.
事实证明这是有效的:
my $dsn = "dbi:Pg:db=mydb;sslmode=require;host=localhost;"
."sslcert='C:\\\\path with\\\\spaces.crt';"
."sslkey='C:\\\\path with\\\\spaces.key'";
Run Code Online (Sandbox Code Playgroud)
为什么我需要双逃逸反斜杠?
我正在尝试做一个简单的查询作为准备好的声明,但没有成功.这是代码:
package sqltest;
use DBI;
DBI->trace(2);
my $dbh = DBI->connect('dbi:mysql:database=test;host=***;port=3306','the_username', '****');
my $prep = 'SELECT me.id, me.session_data, me.expires FROM sys_session me WHERE me.id = ?';
$dbh->{RaiseError} = 1;
my $sth = $dbh->prepare($prep);
$sth->bind_param(1, 'session:06b6d2138df949524092eefc066ee5ab3598bf96');
$sth->execute;
DBI::dump_results($sth);
Run Code Online (Sandbox Code Playgroud)
MySQL服务器响应语法错误near '''.
DBI跟踪的输出显示
-> bind_param for DBD::mysql::st (DBI::st=HASH(0x21e35cc)~0x21e34f4 1 'session:06b6d2138df949524092eefc066ee5ab3598bf96') thr#3ccdb4
Called: dbd_bind_ph
<- bind_param= ( 1 ) [1 items] at perl_test_dbi_params.pl line 10
[...]
>parse_params statement SELECT me.id, me.session_data, me.expires FROM sys_session me WHERE me.id = ?
Binding parameters: SELECT me.id, …Run Code Online (Sandbox Code Playgroud) 我试图让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中使用DBI连接到我的PostgreSQL数据库.一切正常,但在我的调试(打印结果等)中,我无法看到perls DBI模块准备的查询是否真的正确.
我有这样的事情:
$sth->prepare( qq{SELECT * FROM company WHERE companyname LIKE ? AND city = ?});
$sth->execute( $name.'%', $city);
Run Code Online (Sandbox Code Playgroud)
在调用execute之后,我无法看到sql查询的外观,因为execute是将参数绑定到查询的最新步骤.
我希望有类似$sth->getLastExecutedQuery()或类似的东西来查看查询的样子.
在这种情况下,函数getLastExecutedQuery()将返回:
SELECT * FROM company WHERE companyname LIKE 'Company Name%' AND city = 'City name';
Run Code Online (Sandbox Code Playgroud)
有没有办法得到这个?它仅用于调试目的.
我正在使用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 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)