PHP / SQLite - diskten belleğe bir tablo kopyalama

4 Cevap php

I have a sqlite3 database on my harddrive (file.db) with 5 tables. I'd like to copy 3 of these tables to an in-memory database (:memory:).

Php5 PDO biçimini kullanarak bunu yapmak için basit bir yolu var mı?

4 Cevap

Ya da bir durumda yeterli olmayabilir değil pdo özel çözüm:

  • Bellek: veritabanı oluşturmak a
  • Attach varolan veritabanı dosyası
  • TABLO OLUŞTURMA ... * İTİBAREN SEÇİN ...
  • Detach veritabanı dosyası

edit: an example
First an example database stored in mydb.sq3

<?php
$pdo = new PDO('sqlite:mydb.sq3');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$pdo->exec('CREATE TABLE foo(x INTEGER PRIMARY KEY ASC, y, z)');

$stmt = $pdo->prepare("INSERT INTO foo (x,y,z) VALUES (:x,:y,:z)");
$stmt->bindParam(':x', $x);
$stmt->bindParam(':y', $y);
$stmt->bindParam(':z', $z);

for($x=0; $x<100; $x++) {
    $y = $x*2;
    $z = $x*2+1;
    $stmt->execute();
}

Bellek: veritabanı ve tablo foo aktarmak istiyorum şimdi biz bir var

<?php
$pdo = new PDO('sqlite::memory:');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$pdo->exec('ATTACH "mydb.sq3" as filedb');
$pdo->exec('CREATE TABLE bar AS SELECT * FROM filedb.foo');
$pdo->exec('DETACH filedb');

Bitti. Ama sqlite_master masada bir göz atalım

foreach($pdo->query('SELECT sql FROM sqlite_master') as $row) {
    echo $row['sql'];
}

Bu baskılar

CREATE TABLE bar(x INT,y,z)

INTEGER PRIMARY KEY ASC beyanı kaybolur. Ama yeterli olabilir ....

Yapman gereken ne ise, o VolkerK cevabı ben temin ediyorum biridir, ama ben size bu kodu her çalıştırdığınızda (her belleğe bu tabloların içeriğini okumak için gidiyoruz işaret etmek zorunda hissediyorum zaman o sayfayı yükler?), sadece diskten veri dosyalarını sorgulamak için daha iyi olabilir bu yüzden.

Bir her zaman-bellek bağlantıları genelinde kalıcı veritabanları SQLite'nın tutmak için paylaşılan bellek mekanizması çeşit (örneğin APC, memcache, vb.) Kullanabilir unutmayın.

Sen, bağlantının sonunda veritabanı dökümü apc değişken olarak kaydedebilir ve daha sonra yük ve sonraki yürütme başında apc yeniden çalıştırabilirsiniz.