[编辑注:请参阅 <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
, int $flags
= SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, string $encryptionKey
= ""): void打开一个 SQLite 3 数据库。如果构建包含加密,则它将尝试使用密钥。
filename
SQLite 数据库的路径,或 :memory:
用于使用内存数据库。
flags
可选标志,用于确定如何打开 SQLite 数据库。默认情况下,打开使用 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。
*/
class MyDB extends SQLite3
{
function __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 [文件名] as [引用数据库名称]”,它允许打开多个数据库文件并使其可供同一个 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());
// 释放附加数据库文件上的 OS 文件锁;
$bulkload_connection->close();
unset($bulkload_connection);
?>