我最近在测试一个站点时遇到了一个问题,其中PDO_SQLITE
声称它无法读取我的PDO数据库文件。我最近所做的唯一更改是我安装了新版本的PHP,因此安装了新版本的PDO_SQLITE
。搜索网络(我们不应该说谷歌搜索或google,记住;-)),我发现问题是编译到我的PHP安装中的sqlite版本与我最初用于创建数据库的版本不兼容.不要介意它们只是一个或两个不同的微版本。
因此,我遇到了一个难题:我需要创建与我的PDO_SQLITE
安装兼容的文件,但我的CLIsqlite工具不兼容。如果我使用PDO_SQLITE
创建数据库文件,我会丢失我的数据,对吗?
错了。如果您有时发现自己处于同样的情况,您可以采取以下措施。
修复取决于三件事:
PDO_SQLITE
将创建数据库文件(如果它不存在)。- Sqlite具有转储所有SQL以生成和填充数据库中现有表的工具文件。
- PHP_Shell允许您在命令行与PHP交互。
所以,开始吧。首先,创建现有文件的SQL转储。sqlite命令接受两个参数:要使用的数据库文件,以及SQL或sqlite元命令。在这种情况下,我们将传递命令.dump
(注意.
前缀),并将输出重定向到文件:
$ sqlite mydata.db .dump > /tmp/mydata.sql
现在,我们需要删除现有的数据库文件,或者将其备份到某处。完成后,我们将启动PHP_Shell
,使用php-shell.sh
命令(或php-shell.bat
对于Windows用户)。PHP_Shell
是一个方便的实用程序,它提供了一个交互式PHPshell,包括历史和完成。我们将使用它来创建我们的sqlite数据库文件:
% phpshell PHP-Shell - Version 0.3.0, with readline() support (c) 2006, Jan Kneschke >> use '?' to open the inline help >> $db = new PDO('sqlite:/path/to/mydata.db'); PDO::__set_state(array( )) >> quit
创建数据库文件后,我们现在将加载我们之前转储的模式和数据。这里的好处是sqlite实用程序往往更能容忍版本差异,因此我们可以使用它将数据加载到新的数据库文件中,而PHP不会更明智:
$ sqlite mydata.db < /tmp/mydata.sql
全部完成!