[编辑注:请参阅 <https://www.sqlite.org/backup.html>]
关于无法同时打开两个数据库并复制完全相同的信息(例如,创建备份数据库)的快速说明。我在网上搜索了答案,但没有一个能解决问题。附加的评论和解决方案对我来说很复杂。最终我发现可以使用 copy() 函数更简单地实现相同的结果。
<?php
copy("old.db", "new.db");
?>
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
SQLite3::open — 打开 SQLite 数据库
$filename
, 整数 $flags
= SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, 字符串 $encryptionKey
= ""): 空值打开一个 SQLite 3 数据库。如果构建包含加密,则它将尝试使用密钥。
filename
SQLite 数据库的路径,或 :memory:
用于使用内存数据库。
flags
用于确定如何打开 SQLite 数据库的可选标志。默认情况下,open 使用 SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE
。
SQLITE3_OPEN_READONLY
: 只读打开数据库。
SQLITE3_OPEN_READWRITE
: 读写打开数据库。
SQLITE3_OPEN_CREATE
: 如果数据库不存在,则创建它。
encryptionKey
加密和解密 SQLite 数据库时使用的可选加密密钥。如果未安装 SQLite 加密模块,则此参数无效。
不返回值。
示例 #1 SQLite3::open() 示例
<?php
/**
* 扩展 SQLite3 类并更改 __construct
* 参数的简单示例,然后使用 open 方法初始化 DB。
*/
类 MyDB 扩展 SQLite3
{
函数 __construct()
{
$this->open('mysqlitedb.db');
}
}
$db = new MyDB();
$db->exec('CREATE TABLE foo (bar STRING)');
$db->exec("INSERT INTO foo (bar) VALUES ('This is a test')");
$result = $db->query('SELECT bar FROM foo');
var_dump($result->fetchArray());
?>
[编辑注:请参阅 <https://www.sqlite.org/backup.html>]
关于无法同时打开两个数据库并复制完全相同的信息(例如,创建备份数据库)的快速说明。我在网上搜索了答案,但没有一个能解决问题。附加的评论和解决方案对我来说很复杂。最终我发现可以使用 copy() 函数更简单地实现相同的结果。
<?php
copy("old.db", "new.db");
?>
如果您计划同时访问 SQLITE3 数据库,建议更改默认的 SQLite3::busyTimeout 值(默认为零)。否则,您可能在写入数据库时收到“数据库锁定”错误。
通过将超时设置为非零值,对已锁定数据库的写入尝试将在发送错误之前等待锁释放(在超时时间内)。
请注意,SQLITE2 的默认值为 60 秒。
请注意,SQLITE3_OPEN_READONLY 标志不能与 SQLITE3_OPEN_CREATE 标志组合使用。如果您同时使用这两个标志,则会抛出一个相当无用的“无法打开数据库:内存不足”异常。
如果您尝试使用 open() 方法在同一个 SQLite3 对象中打开多个数据库文件(我无法使其工作),以下是在使用 SQL 语言的特殊 SQLite3 语法添加内容的另一种方法。这需要我进行一些调查,因此希望我找到的解决方案也能帮助您。
这些是 SQLite3 中被利用的良好特性
* 表的创建语句查询存储在父数据库文件中的名为“sqlite_master”的表中。
* SQLite3 支持“insert into...select * from”SQL 语法,用于对表进行批量加载速度的插入 - 但如果源表和目标表在单独的数据库文件中怎么办?
* SQLite3 有一个“attach [filename] as [reference database name]”,它允许打开多个数据库文件并使其可访问同一个 SQLite3 对象。
假设您在 SQLite3 数据库文件“source.db”中有一个名为“my_template”的表。您想将此表的副本复制到数据库文件“target.db”中,并将表命名为“working_table”。
<?php
//将源数据库文件附加到批量加载连接对象;
$bulkload_connection = new SQLite3("c:/sqlite3_database_files/source.db");
//检索源表的创建语句查询;
$sourcetbl_create_statement = $bulkload_connection->querySingle("select sql from sqlite_master where type='table' and name='my_template'");
if ($sourcetbl_create_statement===false) exit($bulkload_connection->lastErrorMsg());
//构建目标表的创建语句查询;
$targettbl_create_statement = str_replace('CREATE TABLE my_template', 'CREATE TABLE bulkload.working_table', $sourcetbl_create_statement);
//将目标数据库文件附加到批量加载连接对象 - 并将其引用为名为[bulkload]的数据库;
$result=$bulkload_connection->exec("attach 'c:/sqlite3_database_files/target.db' as bulkload");
if ($result===false) exit($bulkload_connection->lastErrorMsg());
//发出在目标数据库文件中创建目标表的查询;
$result=$bulkload_connection->exec($targettbl_create_statement);
if ($result===false) exit($bulkload_connection->lastErrorMsg());
//尽快将源表中的行复制到目标表;
$result=$bulkload_connection->exec("insert into bulkload.working_table select * from my_template");
if ($result===false) exit($bulkload_connection->lastErrorMsg());
//释放附加的数据库文件上的操作系统文件锁;
$bulkload_connection->close();
unset($bulkload_connection);
?>