从 Bash 或 Perl 脚本运行 SQL 语句?

Posted

技术标签:

【中文标题】从 Bash 或 Perl 脚本运行 SQL 语句?【英文标题】:Running SQL Statement from Bash or Perl Script? 【发布时间】:2016-03-23 18:56:13 【问题描述】:

我想编写一个脚本,Perl 或 Bash,我可以在其中运行一个或多个 Select SQL 语句以从远程数据库中获取一些信息服务器。

目前我可以使用 RazorSQL 和 DbVisualizer 等 GUI 工具连接到数据库并查看表、运行 SQL 命令等...但是,我想尝试从脚本运行一些 SQL 命令,以便可以使用结果来自 Bash/Perl 脚本中的 cmd。

运行数据库的服务器有以下详细信息:

操作系统: Microsoft Windows Server 2003 RS Standard Edition SP2 数据库: Microsoft SQL Server 2005

在 Windows PC 上使用 RazorSQL 连接到数据库时,我的连接使用驱动程序 "net.sourceforge.jtds.jdbc.Driver"。 然后,在我的 linux 机器上使用 DbVisualizer 时,我使用 JDBC 驱动程序 "SQL Server (jTDS)",这两者似乎都可以正常工作。

所以为了尝试从 Perl 中尝试这个,我下载了以下软件包:

unixODBC 免费TDS SQSH ---> *但是,由于 Sybase,我无法编译它... Perl 模块:DBD::ODBC、DBD::JDBC、DBI

为了安装、测试和设置 unixODBC,我使用了这个站点:http://www.easysoft.com/developer/languages/perl/dbd_odbc_tutorial_part_1.html 并使用此站点:http://www.unixodbc.org/doc/UserManual/,添加 DSN...

现在我尝试在此处使用这些指示:http://www.freetds.org/userguide/perl.htm,从 Perl 连接到数据库,但在连接数据库时遇到了一些问题。

谁能告诉我我是否在正确的路径上,或者我的 connect() 字符串应该是什么样子......?在 RazorSQL 中,JDBC“URL”如下所示:

jdbc:jtds:sqlserver://192.168.2.200:1433/ActiveDB;appName=RazorSQL;useCursors=true

我对如何使用我在 Perl 脚本中使用 GUI 命令 ODBCConfig 创建的 DSN 感到困惑......我很难找到一个真实的连接示例到 Perl 中的 MS SQL Server。

列出驱动程序的文件如下所示: odbcinst.ini

[mysql ODBC 3.51.27r695 Driver]
Driver      = /usr/lib/unixODBC/libmyodbc3.so
Setup       = /usr/lib/unixODBC/libmyodbc3S.so
UsageCount  = 1

[JDBC/ODBC bridge driver for java-1_6_0-sun]
Driver      = /usr/lib/jvm/java-1.6.0-sun-1.6.0/jre/lib/i386/libJdbcOdbc.so
Setup       = /usr/lib/jvm/java-1.6.0-sun-1.6.0/jre/lib/i386/libJdbcOdbc.so
UsageCount  = 1

[TDS Driver]
Driver      = /usr/lib/unixODBC/libtdsS.so
Setup       = /usr/lib/unixODBC/libtdsS.so
UsageCount  = 1

[net.sourceforge.jtds.jdbc.Driver]
Driver      = /opt/jtds-1.3.1/jtds-1.3.1.jar
Setup       = /opt/jtds-1.3.1/jtds-1.3.1.jar
UsageCount  = 1

*此列表中的最后一个与 RazorSQL 使用的驱动程序相同,但由于它是一个 jar 文件,我猜它只能用于 Java 程序...

这是在 ~/.odbc.ini

[MyDB]
Driver      = /usr/lib/unixODBC/libtdsS.so
Description = 
SERVER      = serverName.foo.bar.local
PORT        = 1433
USER        = user1
Password    = abc123
Database    = ActiveDB

鉴于此,我的“connect()”字符串在 Perl 中的外观应该如何,这是否是正确的驱动程序使用...?

我是使用脚本尝试此操作的新手,而我的头目前正在与信息一起旋转......所以任何人可以提供的帮助将不胜感激!

【问题讨论】:

【参考方案1】:

在浏览了 DBD::ODBC 文档后,我找到了一些示例。 This one 执行以下操作(我删除了一些部分,这不是文字引用)。

my $dsn = "DRIVER=SQL Server;SERVER=$optionsDbSrcServer;DATABASE=$optionsDbSrcDatabase;NETWORK=dbmssocn;UID=$optionsDbSrcLoginName;PWD=$optionsDbSrcPassword";
my $dbh = DBI->connect("DBI:ODBC:$dsn") || die "DBI connect failed: $DBI::errstr\n";
$dbh->AutoCommit = 0;      # enable transactions, if possible
$dbh->RaiseError = 0;
$dbh->PrintError = 1;      # use RaiseError instead
$dbh->ShowErrorStatement = 1;

不幸的是,驱动程序文档中没有真正的解释,所以让我们继续吧。我们知道有一个DRIVER= 和一个SERVER= 等等。这些也存在于您的 odbc.ini 中,因此您应该尝试一下。

my $dsn = "DRIVER=/usr/lib/unixODBC/libtdsS.so;SERVER=serverName.foo.bar.local;PORT=1433;DATABASE=ActiveDB;UID=user1;PWD=abc123";

免责声明:我无法对此进行测试,也不知道它是否有效。这只是我会尝试的有根据的猜测。


您也可以尝试使用 DBD::JDBC,这听起来比较容易。 This part of its docs describe the dsn。但是您需要一些依赖项。不过,我相信您已经介绍了其中一些。

【讨论】:

感谢simbabque的回复,非常感谢您的帮助..!那并不完全奏效。我在 DBI 连接线上收到错误消息:“失败:[unixODBC][Driver Manager]Data source name not found, and no default driver specified (SQL-IM002)”...所以这让我开始思考,我将整个 $dsn = "..." 替换为 DSN 的名称,*即“[MyDB]”.. 所以我有my $dsn = "MyDB";。而这次命令花了很长时间才最终失败,这次我得到了一个不同的错误:“Lost connection to MySQL server at 'reading initial communication packet', system error: 104” 为什么会尝试连接 MySQL?我们不是在谈论 Microsoft sql server 吗? 我尝试使用我添加到 ODBCConfig GUI 中的每个驱动程序,这些驱动程序是用 odbcinst.ini 编写的......而且那个似乎比其他的更进一步,该测试的驱动程序是 "/usr/lib/unixODBC/libmyodbc3.so" 我现在看到的是 MySQL 而不是 SQL Server。我的坏... 我要试一试 DBD::JDBC 看看能不能让它工作...我会尽快回复...谢谢又来了!【参考方案2】:

好的...我相信我有这个工作。再次感谢 simbadque 的建议,非常感谢您抽出时间提供帮助!

在所有这些过程中,我变得如此混乱和转身,我什至不确定哪条路是向上的......所以,我决定忽略我到目前为止所做的一切并重新开始看这个.最后我找到了一个优秀的指南,有人写的正是我想做的事(*shocker...)!!

我在 PerlMonks.org 的以下链接中找到了这些说明(*我知道标题很明显)使用 DBD::Sybase 从 Linux 访问 Microsoft SQL Server --> http://www.perlmonks.org/?node_id=392385

基本上,简而言之,我需要执行以下操作:

    卸载 FreeTDS: 我需要在我最初编译/安装它的源目录中执行 make uninstall...

    重新编译并重新安装 FreeTDS: 使用它作为配置命令重新配置 freetds --> ./configure --prefix=/usr/local/freetds --with-tdsver=7.0

    配置 FreeTDS.conf (*after make install):在配置文件中添加以下行: try server login = yes try domain login = no tds version = 7.0 这些行使它使用数据库登录凭据而不是 Windows 域登录信息。 tds 版本 7 告诉 freetds 连接到数据库的版本,并读​​取版本 7 适用于比 MS SQL Server 2000 更新的 SQL Server 版本...

    freetds.conf 中创建服务器条目:我添加了以下几行来添加运行 MS SQL Server 2005 数据库的服务器。@ 987654326@

    测试“mydb”条目: /usr/local/freetds/bin/tsql -S mydb -U sqlUsername 运行该命令后,我会提示输入密码,然后我会收到一个类似于 "1> " 的命令提示符,它告诉您它已成功登录。!

    最后,在 Perl 中进行测试: *下面是我用来从 SQLServer 数据库中获取数据的示例代码...

    #!/usr/bin/perl
    
    use DBI;
    
    $dsn = 'DBI:Sybase:server=mydb';
    
    my $dbh = DBI->connect($dsn, "sqlUsername", 'sqlUserPwd');
    die "unable to connect to server $DBI::errstr" unless $dbh;
    
    $dbh->do("use DatabaseName");
    
    $query = "Select * from EXAMPLE_TABLENAME";
    $sth = $dbh->prepare ($query) or die "prepare failed\n";
    $sth->execute( ) or die "unable to execute query $query   error $DBI::errstr";
    
    $rows = $sth->rows ;
    print "$row rows returned by query\n";
    
    while ( @first = $sth->fetchrow_array ) 
        foreach $field (@first) 
            print "field: $field\n";
        
    
    

然后我执行了那个 Perl 脚本和 VIOLA...!!我从 Select 语句中取回了数据!

希望这可以帮助其他希望做同样事情的人......我想如果我想用 Bash 之类的东西来做这件事,我可能可以使用 FreeTDS 附带的命令之一,比如 tsql、osql 等...但是,我对此并不乐观。

【讨论】:

以上是关于从 Bash 或 Perl 脚本运行 SQL 语句?的主要内容,如果未能解决你的问题,请参考以下文章

Perl DBI - 使用多个语句运行 SQL 脚本

在 Perl 脚本中运行 PL/SQL 过程

bash脚本中的Perl哈希等效? [复制]

在 Perl 脚本上使用另一个解释器运行代码

在 bash 中包装 perl 脚本 - 回显到 IRC 机器人

如何在不运行Bash脚本的情况下语法检查?