使用sqlite_open_flags 属性,如DBD::SQLite documentation 中所述:
use DBD::SQLite;
my $dbh = DBI->connect("dbi:SQLite:$dbfile", undef, undef, {
sqlite_open_flags => DBD::SQLite::OPEN_READONLY,
});
如果您尝试打开一个不存在的数据库(通常会创建一个新数据库)或尝试写入现有数据库,这将导致错误。
请注意,您必须明确 use DBD::SQLite; 才能使用常量 DBD::SQLite::OPEN_READONLY。
请注意,DBI 提供了ReadOnly 句柄属性,但 DBD::SQLite 在 v1.49_05 之前不支持它:
use strict;
use warnings;
use Data::Dump;
use DBI;
my $db = 'foo.db';
unlink $db if -f $db;
my $dbh = DBI->connect("dbi:SQLite:dbname=$db",'','', {
RaiseError => 1,
ReadOnly => 1
});
$dbh->do( q{CREATE TABLE foo(id INTEGER, name TEXT)} );
$dbh->do( q{INSERT INTO foo VALUES(1, 'foo')} );
my $values = $dbh->selectall_arrayref( q{SELECT * FROM foo} );
dd $values;
输出:
[[1, "foo"]]
切换到sqlite_open_flags => DBD::SQLite::OPEN_READONLY 会导致错误。
如果数据库不存在:
DBI connect('dbname=foo.db','',...) failed: unable to open database file
如果数据库存在:
DBD::SQLite::db do failed: attempt to write a readonly database
从 DBD::SQLite v1.49_05 开始,您还可以使用ReadOnly 属性,但只能作为connect 的一个选项。连接后设置属性不起作用并抛出警告:
my $dbh = DBI->connect("dbi:SQLite:dbname=$db",'','', {
RaiseError => 1
});
$dbh->{ReadOnly} = 1;
输出:
DBD::SQLite::db STORE 警告:ReadOnly 已设置,但它只是建议性的