如何使用Perl6中的DBIish连接本地MySQL Server 8.0

10
我正在开发一个Perl6项目,但在连接MySQL时遇到了困难。即使使用DBIish(或perl6.org教程)的示例代码,连接也会失败。如果有建议或意见,将不胜感激!用户凭据已确认准确。
我在Windows 10上运行此项目,并使用带有Rakudo Star的标准Perl6和MySQL Server 8.0。我尝试过多种方式修改连接字符串,例如:$password :password<> :password()等,但无法建立连接。还应注意,我已安装ODBC、C、C++和.Net连接器。
#!/usr/bin/perl6
use v6.c;
use lib 'lib';
use DBIish;
use Register::User;

# Windows support
%*ENV<DBIISH_MYSQL_LIB> = "C:/Program Files/MySQL/MySQL Server 8.0/liblibmysql.dll"
    if $*DISTRO.is-win;

my $dbh = DBIish.connect('mysql', :host<localhost>, :port(3306), :database<dbNameHere>, :user<usernameHere>, :password<pwdIsHere>) or die "couldn't connect to database"; 
my $sth = $dbh.prepare(q:to/STATEMENT/);
    SELECT *
    FROM users
    STATEMENT

$sth.execute();

my @rows = $sth.allrows();

for @rows { .print }
say @rows.elems;

$sth.finish;
$dbh.dispose;

这应该是连接到数据库。然后应用程序运行查询,接着打印每个结果行。但实际发生的是每次应用程序都会遇到“die”消息。


我在这里看不到的是默认设置的一部分,即主机:https://github.com/perl6/DBIish#mysql。可能默认设置对Windows不起作用,或者根本没有默认设置。从这里开始:https://github.com/perl6/DBIish/blob/58d2a4e5d2492cbd6ed172ad10482e2b47b7d246/lib/DBDish/mysql.pm6#L10,默认主机是localhost。这在Windows上可行吗? - jjmerelo
1
很好,无论是否添加它,它都不起作用,我简单地忘记将其添加回来。我尝试过:host<localhost>和:host<127.0.0.1>,但都没有成功。 - CoderLee
3
未经测试,这只是一个猜测,但也许 %*ENV<DBIISH_MYSQL_LIB> 被设置得太晚了?尝试 BEGIN %*ENV<DBIISH_MYSQL_LIB> = "C:/Program Files/MySQL/MySQL Server 8.0/liblibmysql.dll" if $*DISTRO.is-win; - mscha
@mscha 看起来加上或不加上似乎没有区别,可能是.dll文件有问题吗?我已经尝试过那个和C连接器的。 - CoderLee
3个回答

5

这更多是一种解决方法,但不能使用DB会导致严重问题。因此,即使尝试使用NativeLibs,我也无法通过DBIish建立连接。相反,我选择使用DB::MySQL,这个模块证明非常有用。只需几行代码,此模块就可满足您的数据库需求:

use DB::MySQL;

my $mysql = DB::MySQL.new(:database<databaseName>, :user<userName>, :password<passwordHere>);
my @users = $mysql.query('select * from users').arrays;

for @users { say "user #$_[0]: $_[1] $_[2]"; }

#Results would be:
#user #1: FirstName LastName
#user #2: FirstName LastName
#etc...

这将会打印出每个用户的一行信息,格式如上所示。虽然不像DBIish那么常见,但是这个模块能够按需完成任务。你还可以使用它做很多其他的事情,因此我强烈建议阅读文档。

3
根据 github DBIish issue 127 的内容:
环境变量DBIISH_MYSQL_LIB已被删除,不知道是否有人恢复了它。
然而,如果您添加该库的路径,且文件名为mysql.dll,则可以正常工作。这对于科学方法来说并不是一个好结果。
因此需要进行更多的测试 - 或许...
C:\Program Files\MySQL\MySQL Server 8.0\lib>mklink mysql.dll .\libmysql.dll

显然,您可以创建自己的lib目录并将其添加到路径中,然后将此符号链接添加到该目录。

希望这可以帮助您。 我已经花了几个小时了。

编辑:仍在花时间-稍后再记账。

有一些非常短暂的事情正在发生。我重置了机器(也许从现在开始总是这样做),仍然出现缺少mysql.dll错误。尝试进入MySQL lib目录以从那里执行raku ...成功了。更改目录时却不行。

启动管理员cmd-从主目录开始,尝试raku命令。好了。好吧,不好,但可能是一致的。启动非管理员cmd,尝试从MySQL lib目录运行它,它可以工作。只是为了好玩,尝试在该目录之外运行.. 它也工作了。

现在我无法使其停止工作了。 将探讨NativeLibs :: Searcher,如Valle Lukas所建议的那样!


2
也许dbiish存储库中的示例不再有效。
DBIISH_MYSQL_LIB Env似乎已被NativeLibs::Searcher替换,并使用提交9bc4191 查看NativeLibs::Searcher可能有助于找到问题的根本原因。
"最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接