多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 使用 Perl 连接到 SQLite 数据库 > 原文: [http://zetcode.com/db/sqliteperltutorial/connect/](http://zetcode.com/db/sqliteperltutorial/connect/) SQLite Perl 教程的这一部分将展示如何创建与数据库的数据库连接。 第一步是连接到数据库。 我们使用`connect()` DBI 方法建立连接。 `disconnect()`方法用于关闭数据库连接。 ```perl $dbh = DBI->connect($dsn, $username, $password) or die $DBI::errstr; $dbh = DBI->connect($dsn, $username, $password, \%attr) or die $DBI::errstr; ``` `connect()`方法建立与请求的数据源的数据库连接。 如果连接成功,它将返回数据库句柄对象。 我们使用`disconnect()`方法终止连接。 `$dsn`是数据源名称。 它是一个字符串,告诉 Perl DBI 模块,应加载哪种驱动程序以及将要建立连接的数据库的位置。 ```perl dbi:DriverName:database_name dbi:DriverName:database_name@hostname:port dbi:DriverName:database=database_name;host=hostname;port=port ``` 上面的字符串是 Perl DBI 中数据源名称的示例。 ```perl dbi:SQLite:dbname=test.db ``` 我们将使用此数据源名称。 `dsn`始终以`dbi:`子字符串开头。 然后我们有驱动程序名称。 在我们的例子中,驱动程序名称为 SQLite。 第三部分是数据库名称。 在本教程中,我们将使用`test.db`。 ```perl dbi:SQLite:dbname=:memory: ``` 我们还可以使用上述数据源名称在内存中创建数据库。 对于 SQLite 数据库,我们不提供`$username`和`$password`。 数据库不支持它。 我们在那儿留下了两个空弦。 最后一个参数是对哈希的引用,在哈希中,我们可以设置属性以更改连接的默认设置。 例如,`RaiseError`属性可用于强制错误引发异常,而不是返回错误代码。 `HandleError`属性可用于提供子程序,以防发生错误。 `AutoCommit`属性设置或取消设置自动提交模式。 `$DBI::errstr`是一个 DBI 动态属性,它返回本地数据库引擎错误消息。 如果连接失败,则会显示此消息,并且脚本将中止。 ## 版本 在第一个代码示例中,我们将获得 SQLite 数据库的版本。 ```perl #!/usr/bin/perl use strict; use DBI; my $dbh = DBI->connect( "dbi:SQLite:dbname=test.db", "", "", { RaiseError => 1 }, ) or die $DBI::errstr; my $sth = $dbh->prepare("SELECT SQLITE_VERSION()"); $sth->execute(); my $ver = $sth->fetch(); print @$ver; print "\n"; $sth->finish(); $dbh->disconnect(); ``` 在上面的 Perl 脚本中,我们连接到先前创建的`test.db`数据库。 我们执行一条 SQL 语句,该语句返回 SQLite 数据库的版本。 ```perl use DBI; ``` 我们使用 Perl DBI 模块连接到 SQLite 数据库。 ```perl my $dbh = DBI->connect( "dbi:SQLite:dbname=test.db", "", "", { RaiseError => 1 }, ) or die $DBI::errstr; ``` 在这里,我们连接到`test.db`数据库。 第一个参数是数据源名称。 在字符串中,我们指定数据库驱动程序和数据库名称。 第二个和第三个参数为空。 在其他情况下,我们在那里提供用户名和密码。 最后一个参数是数据库选项。 我们将`RaiseError`选项设置为 1。这将导致引发异常,而不是返回错误代码。 ```perl my $sth = $dbh->prepare("SELECT SQLITE_VERSION()"); $sth->execute(); ``` `prepare()`方法准备一条 SQL 语句供以后执行。 `execute()`方法执行 SQL 语句。 ```perl my $ver = $sth->fetch(); ``` 我们获取数据。 ```perl print @$ver; print "\n"; ``` 我们将检索到的数据打印到控制台。 ```perl $sth->finish(); ``` 在这里,我们指示将不再从此语句句柄中获取任何数据。 ```perl $dbh->disconnect(); ``` 我们关闭与数据库的连接。 ```perl $ ./version.pl 3.7.9 ``` 执行`verion.pl`脚本,我们得到 SQLite 数据库的版本。 ## 插入数据 我们将创建一个`Cars`表并在其中插入几行。 ```perl #!/usr/bin/perl use strict; use DBI; my $dbh = DBI->connect( "dbi:SQLite:dbname=test.db", "", "", { RaiseError => 1} ) or die $DBI::errstr; $dbh->do("DROP TABLE IF EXISTS Cars"); $dbh->do("CREATE TABLE Cars(Id INT PRIMARY KEY, Name TEXT, Price INT)"); $dbh->do("INSERT INTO Cars VALUES(1,'Audi',52642)"); $dbh->do("INSERT INTO Cars VALUES(2,'Mercedes',57127)"); $dbh->do("INSERT INTO Cars VALUES(3,'Skoda',9000)"); $dbh->do("INSERT INTO Cars VALUES(4,'Volvo',29000)"); $dbh->do("INSERT INTO Cars VALUES(5,'Bentley',350000)"); $dbh->do("INSERT INTO Cars VALUES(6,'Citroen',21000)"); $dbh->do("INSERT INTO Cars VALUES(7,'Hummer',41400)"); $dbh->do("INSERT INTO Cars VALUES(8,'Volkswagen',21600)"); $dbh->disconnect(); ``` 上面的脚本创建一个`Cars`表,并将 8 行插入到该表中。 ```perl $dbh->do("CREATE TABLE Cars(Id INT PRIMARY KEY, Name TEXT, Price INT)"); ``` `do()`方法执行 SQL 语句。 它将两个方法调用`prepare()`和`execute()`组合为一个调用。 `do()`方法用于非选择语句。 ```perl $dbh->do("INSERT INTO Cars VALUES(1,'Audi',52642)"); $dbh->do("INSERT INTO Cars VALUES(2,'Mercedes',57127)"); ``` 这两行将两辆车插入表。 请注意,默认情况下,我们处于自动提交模式,其中对表的所有更改均立即生效。 ```perl sqlite> .mode column sqlite> .headers on ``` 我们使用`sqlite3`工具验证写入的数据。 首先,我们修改数据在控制台中的显示方式。 我们使用列模式并打开标题。 ```perl sqlite> SELECT * FROM Cars; Id Name Price ---------- ---------- ---------- 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600 ``` 这是我们已写入`Cars`表的数据。 ## 最后插入的行 ID 有时,我们需要确定最后插入的行的 ID。 在 Perl DBI 中,我们使用`last_insert_id()`方法进行查找。 ```perl #!/usr/bin/perl use strict; use DBI; my $dbh = DBI->connect( "dbi:SQLite:dbname=:memory:", "", "", { RaiseError => 1 }, ) or die $DBI::errstr; $dbh->do("CREATE TABLE Friends(Id INTEGER PRIMARY KEY, Name TEXT)"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Tom')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Rebecca')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Jim')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Robert')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Julian')"); my $id = $dbh->last_insert_id("", "", "Friends", ""); print "The last Id of the inserted row is $id\n"; $dbh->disconnect(); ``` 我们在内存中创建一个`Friends`表。 `Id`自动递增。 ```perl $dbh->do("CREATE TABLE Friends(Id INTEGER PRIMARY KEY, Name TEXT)"); ``` 在 SQLite 中,`INTEGER PRIMARY KEY`列自动增加。 还有一个`AUTOINCREMENT`关键字。 在`INTEGER PRIMARY KEY AUTOINCREMENT`中使用时,会使用稍微不同的算法来创建`Id`。 ```perl $dbh->do("INSERT INTO Friends(Name) VALUES ('Tom')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Rebecca')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Jim')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Robert')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Julian')"); ``` 这五个 SQL 语句将五行插入到`Friends`表中。 ```perl my $id = $dbh->last_insert_id("", "", "Friends", ""); ``` 使用`last_insert_id()`方法,我们获得最后插入的行 ID。 ```perl $ ./lastrowid.pl The last Id of the inserted row is 5 ``` 我们看到了脚本的输出。 ## 取得数据 在本章的最后一个示例中,我们获取一些数据。 有关数据获取的更多信息将在“查询”一章中进行讨论。 ```perl #!/usr/bin/perl use strict; use DBI; my $dbh = DBI->connect( "dbi:SQLite:dbname=test.db", { RaiseError => 1 } ) or die $DBI::errstr; my $sth = $dbh->prepare( "SELECT * FROM Cars WHERE Id=1" ); $sth->execute(); my ($id, $name, $price) = $sth->fetchrow(); print "$id $name $price\n"; my $fields = $sth->{NUM_OF_FIELDS}; print "We have selected $fields field(s)\n"; my $rows = $sth->rows(); print "We have selected $rows row(s)\n"; $sth->finish(); $dbh->disconnect(); ``` 在示例中,我们从`Cars`表中获取一行。 我们还将找出我们选择了多少字段&行。 ```perl my $sth = $dbh->prepare( "SELECT * FROM Cars WHERE Id=1" ); $sth->execute(); ``` 我们使用`prepare()`方法准备一条 SQL 语句。 SQL 字符串被发送到 SQLite 数据库引擎进行处理。 检查其语法和有效性。 该方法返回一个语句句柄。 然后执行 SQL 语句。 准备将数据发送到客户端程序。 ```perl my ($id, $name, $price) = $sth->fetchrow(); print "$id $name $price\n"; ``` 使用`fetchrow()`方法从数据库中检索数据。 该方法以 Perl 列表的形式从表中返回一行。 ```perl my $fields = $sth->{NUM_OF_FIELDS}; ``` `NUM_OF_FIELDS`是一个语句句柄属性,它为我们提供了返回字段的数量。 在我们的情况下,我们返回了三个字段:`Id`,`Name`和`Price`。 ```perl my $rows = $sth->rows(); ``` 我们得到选定的行数。 我们仅从表中检索到一行。 `rows()`方法返回受影响的行数。 它可以用于`SELECT`,`UPDATE`和`DELETE SQL`语句。 ```perl $ ./fetchrow.pl 1 Audi 52642 We have selected 3 field(s) We have selected 1 row(s) ``` `fetchrow.pl`脚本的输出。 在 SQLite Perl 教程的这一章中,我们展示了如何建立与 SQLite 数据库的数据库连接。 我们已经解释了对数据库进行一些基本工作的脚本。