> 数据库 > SQLite >

如何用Perl访问SQLite数据库

SQLite是一个零配置、无服务端、基于文件的事务型数据库系统。由于它的轻量级,自包含和紧凑的设计,所以当你想要集成数据库到你的程序中时,SQLite是一个非常不错的选择。在这篇文章中,我会展示如何用Perl脚本来创建和访问SQLite数据库。我演示的Perl代码片段是完整的,所以你可以很简单地修改并集成到你的项目中。

访问SQLite的准备

我会使用SQLite DBI Perl驱动来连接到SQLite3。因此你需要在Linux中安装它(和SQLite3一起)。

Debian、 Ubuntu 或者 Linux Mint


  1. $ sudo apt-get install sqlite3 libdbd-sqlite3-perl

CentOS、 Fedora 或者 RHEL


  1. $ sudo yum install sqlite perl-DBD-SQLite

安装后,你可以检查SQLite驱动可以通过下面的脚本访问到。


  1. #!/usr/bin/perl
  2.  
  3. my @drv = DBI->available_drivers();
  4. print join("\n", @drv), "\n";

如果你运行脚本,你应该会看见下面的输出。


  1. DBM
  2. ExampleP
  3. File
  4. Gofer
  5. Proxy
  6. SQLite
  7. Sponge

Perl SQLite 访问示例

下面就是Perl访问SQLite的示例。这个Perl脚本会演示下面这些SQLite数据库的常规管理。

  • 创建和连接SQLite数据库
  • 在SQLite数据库中创建新表
  • 在表中插入行
  • 在表中搜索和迭代行
  • 在表中更新行
  • 在表中删除行

  1. use DBI;
  2. use strict;
  3.  
  4. # 定义数据库名称和驱动
  5. my $driver = "SQLite";
  6. my $db_name = "xmodulo.db";
  7. my $dbd = "DBI:$driver:dbname=$db_name";
  8.  
  9. # sqlite 没有用户名密码的概念
  10. my $username = "";
  11. my $password = "";
  12.  
  13. # 创建并连接到数据库
  14. # 以下创建的文件名为 xmodulo.db
  15. my $dbh = DBI->connect($dbd, $username, $password, { RaiseError => 1 })
  16. or die $DBI::errstr;
  17. print STDERR "Database opened successfully\n";
  18.  
  19. # 创建表
  20. my $stmt = qq(CREATE TABLE IF NOT EXISTS NETWORK
  21. (ID INTEGER PRIMARY KEY AUTOINCREMENT,
  22. HOSTNAME TEXT NOT NULL,
  23. IPADDRESS INT NOT NULL,
  24. OS CHAR(50),
  25. CPULOAD REAL););
  26. my $ret = $dbh->do($stmt);
  27. if($ret < 0) {
  28. print STDERR $DBI::errstr;
  29. } else {
  30. print STDERR "Table created successfully\n";
  31. }
  32.  
  33. # 插入三行到表中
  34. $stmt = qq(INSERT INTO NETWORK (HOSTNAME,IPADDRESS,OS,CPULOAD)
  35. VALUES ('xmodulo', 16843009, 'Ubuntu 14.10', 0.0));
  36. $ret = $dbh->do($stmt) or die $DBI::errstr;
  37.  
  38. $stmt = qq(INSERT INTO NETWORK (HOSTNAME,IPADDRESS,OS,CPULOAD)
  39. VALUES ('bert', 16843010, 'CentOS 7', 0.0));
  40. $ret = $dbh->do($stmt) or die $DBI::errstr;
  41.  
  42. $stmt = qq(INSERT INTO NETWORK (HOSTNAME,IPADDRESS,OS,CPULOAD)
  43. VALUES ('puppy', 16843011, 'Ubuntu 14.10', 0.0));
  44. $ret = $dbh->do($stmt) or die $DBI::errstr;
  45.  
  46. # 在表中检索行
  47. $stmt = qq(SELECT id, hostname, os, cpuload from NETWORK;);
  48. my $obj = $dbh->prepare($stmt);
  49. $ret = $obj->execute() or die $DBI::errstr;
  50.  
  51. if($ret < 0) {
  52. print STDERR $DBI::errstr;
  53. }
  54. while(my @row = $obj->fetchrow_array()) {
  55. print "ID: ". $row[0] . "\n";
  56. print "HOSTNAME: ". $row[1] ."\n";
  57. print "OS: ". $row[2] ."\n";
  58. print "CPULOAD: ". $row[3] ."\n\n";
  59. }
  60.  
  61. # 更新表中的某行
  62. $stmt = qq(UPDATE NETWORK set CPULOAD = 50 where OS='Ubuntu 14.10';);
  63. $ret = $dbh->do($stmt) or die $DBI::errstr;
  64.  
  65. if( $ret < 0 ) {
  66. print STDERR $DBI::errstr;
  67. } else {
  68. print STDERR "A total of $ret rows updated\n";
  69. }
  70.  
  71. # 从表中删除某行
  72. $stmt = qq(DELETE from NETWORK where ID=2;);
  73. $ret = $dbh->do($stmt) or die $DBI::errstr;
  74.  
  75. if($ret < 0) {
  76. print STDERR $DBI::errstr;
  77. } else {
  78. print STDERR "A total of $ret rows deleted\n";
  79. }
  80.  
  81. # 断开数据库连接
  82. $dbh->disconnect();
  83. print STDERR "Exit the database\n";

上面的Perl脚本运行成功后会创建一个叫“xmodulo.db”的数据库文件,并会有下面的输出。


  1. Database opened successfully
  2. Table created successfully
  3. ID: 1
  4. HOSTNAME: xmodulo
  5. OS: Ubuntu 14.10
  6. CPULOAD: 0
  7.  
  8. ID: 2
  9. HOSTNAME: bert
  10. OS: CentOS 7
  11. CPULOAD: 0
  12.  
  13. ID: 3
  14. HOSTNAME: puppy
  15. OS: Ubuntu 14.10
  16. CPULOAD: 0
  17.  
  18. A total of 2 rows updated
  19. A total of 1 rows deleted
  20. Exit the database

错误定位

如果你尝试没有安装SQLite DBI驱动的情况下使用Perl访问SQLite的话,你会遇到下面的错误。你必须按开始说的安装DBI驱动。


  1. Can't locate DBI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./script.pl line 3.
  2. BEGIN failed--compilation aborted at ./script.pl line 3.

via: http://xmodulo.com/access-sqlite-database-perl.html

(责任编辑:IT)