SQLite3 a pár tipů pro vaše aplikace

MyEgo.cz

home foto blogy mywindows.cz kontakt

SQLite3 a pár tipů pro vaše aplikace

PHP 29.04.07

Pokud převádíte vaše aplikace na použití SQLite databáze v PHP, mám pro vás pár poznatků.

Používejte PDO SQLite, nikoliv sqlite_ funkce

PHP obsahuje dvě sady funkcí pro práci s SQLite databází, jedna sada funkcí začíná na sqlite_ a druhá je implementována formou PDO. Použijte rozhodně PDO, podporuje totiž SQLite verze 2 i 3, s tím, že verze 3 již neobsahuje tolik kritických a nepříjemných bugů jako verze 2.

Vlastní sada funkcí sqlite_ je v praxi téměř nepoužitelná, podporuje jen SQLite2.

SELECT uzamyká celou tabulku

Představte si, že máte následující kód:

SELECT * FROM table LIMIT 0,1
UPDATE table SET id=1 WHERE ...

Prostě triviální kód, kde z tabulky něco načtete přes SELECT a následně na tabulku uděláte UPDATE. Nebude to fungovat.

SQLite3 to nepovoluje, po SELECTu je tabulka uzamčena dokud neprovedete kompletní fetch() předchozího dotazu nebo zavření resource dotazu. Můžete to udělat třeba pomocí funkce unset($resource).

Pokud máte SELECT na více položek a v cyklu děláte UPDATE, jediná slušná možnost jak z tohoto problému ven je v databázovém layeru zavolat funkci fetchAll(), načíst veškeré hodnoty z tabulky do paměti, resource uzavřít, a v cyklu již dělat pouze UPDATE.

Je to opravdu velice nepříjemné omezení, ale SQLite3 je takto primitivní…

VIEW neumí update / insert / delete, TRIGGER na VIEW ale ano

SQLite3 umí vytvořit VIEWs, nicméně, nelze na nich provádět UPDATE, DELETE a INSERT příkazy. Naštěstí se to dá obejít pomocí TRIGGERu s parametrem INSTEAD OF.

Takže můžete psát třeba následující:

CREATE TRIGGER foto_users_delete
  INSTEAD OF DELETE
  ON foto_users
BEGIN
DELETE FROM forum_users WHERE username = OLD.username;
END;

Komentáře

  1. 1 Milan Matějček 07.02.10, 10:02:10
    FB

    Prosim,
    jak se vyresi ceske razeni? Nyni mi konci Č, Š... na konci seznamu
    PHP 5.3.1 a sqlite3 3.6.neco