【问题标题】:Attach unlimited sqlite databases using php使用 php 附加无限的 sqlite 数据库
【发布时间】:2017-01-14 20:47:52
【问题描述】:

一个设备每 10 分钟生成不同​​行的 .db 文件。所有的 sqlite 文件都有同一个名为“wifi”的表。

我正在编写一个 php 应用程序来读取所有文件中的所有数据。我正在使用 ATTACH 方法来组合数据库。喜欢:

try {
$file_db = new PDO('sqlite::memory:');

$file_db->setAttribute(PDO::ATTR_ERRMODE,
                        PDO::ERRMODE_EXCEPTION);

$file_db->exec("ATTACH DATABASE 'wifi_16-09-02_09_44_06.db' AS db1");
//many more attached files here, like 1000 or 2000

$result = $file_db->query('SELECT * FROM db1.wifi UNION ALL SELECT * FROM db2.wifi, ...');

$file_db = null;
}
catch(PDOException $e) {
echo $e->getMessage();

错误:

SQLSTATE[HY000]:一般错误:1 附加数据库过多 - 最多 10 个

写完这段代码后发现sqlite attach有一个限制,默认是10,只能根据this增加到125。

如何附加数千个数据库?如果我的方法是错误的,解决这个问题的最佳方法是什么?

【问题讨论】:

  • 您不需要一次将它们全部连接起来,是吗?读取后将当前的分离出来即可。
  • 为什么不能为每个“数据库”打开一个新连接?

标签: php sqlite pdo


【解决方案1】:

只需将每个新数据库作为新的 PDO 实例打开即可。

$file_db = new PDO('sqlite::wifi_16-09-02_09_44_06.db');
$file_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$result = $file_db->query('SELECT * FROM db1.wifi UNION ALL SELECT * FROM db2.wifi, ...');
// do whatever
$file_db = new PDO('sqlite::wifi_whatever.db');
$file_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$result = $file_db->query('SELECT * FROM db1.wifi UNION ALL SELECT * FROM 

等等。

就这么简单。

【讨论】:

    【解决方案2】:

    有一些方法可以解决这个问题。例如,您可以更改您的编程方法,因此您不需要附加很多 sqlite 数据库。但是,为了通过此限制,我认为您可以更改 SQLite 的编译选项,有关更多信息,请查看以下链接: http://www.sqlite.org/compile.html

    【讨论】:

      【解决方案3】:

      拥有数千个数据库是错误的。

      您应该将所有数据放入单个数据库中的单个表中。

      如果无法做到这一点,无论如何都要这样做,方法是创建一个临时数据库并一一复制数据。

      【讨论】:

      • 你能看看我的问题的评论吗? iainn 提到使用分离。它会解决我的问题吗?看起来更简单
      • cos,创建临时数据库让我的工作加倍,我相信
      猜你喜欢
      • 1970-01-01
      • 2021-01-10
      • 2019-12-20
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 2012-04-02
      • 2013-08-07
      相关资源
      最近更新 更多