Minęło trochę czasu od kiedy zacząłem testować bazę danych SQLite. Pierwsze kroki w tym temacie opisałem w artykule Baza danych SQLite (przesiadka z MySql). Od tamtej pory znalazłem parę problemów, które pojawiają się nie tylko przy przesiadce z MySQL. Oto najważniejsze z nich.
Największym problemem i według mnie niedociągnięciem jest brak obsługi ALTER TABLE. Ta komenda w SQLite jest po prostu nie zaimplementowana. Jest to spore utrudnienie, kiedy tworzymy oprogramowanie i nagle się okazuje, że musimy dodać w bazie jeszcze jedno albo więcej pól.
Normalnie każdy by napisał ALTER TABLE itd. Natomiast w bazie danych SQLite trzeba to robić na około. Wpierw musimy stworzyć tabelę tymczasową, która będzie wierną kopią tabeli, do której chcemy dodać pole. następnie do tej tabeli tymczasowej musimy wgrać wszystkie dane z istniejącej tabeli. Następnie usuwany starą tabelę i tworzymy nową tabelę na podstawie starej, uwzględniając zmiany, jakie chcieliśmy nanieść na starej tabeli. Na końcu pozostaje Nam przeniesienie danych z tabeli tymczasowej do nowo utworzonej i usunięcie tabeli tymczasowej.
CREATE TEMPORARY TABLE tabelaTymczasowa (...); INSERT INTO tabelaTymczasowa SELECT * FROM staraTabela; DROP TABLE staraTabela; CREATE TABLE poprawionaStaraTabela (...); INSERT INTO poprawionaStaraTabela (...) SELECT ... FROM tabelaTymczasowa;
Jest to sposób niezbyt wygodny i wymagający sporo zabawy, ale skuteczny. Poza tym jest to chyba jedyne wyjście z sytuacji.
Kolejnym problemem w bazie danych SQLite są apostrofy. W MySQL do stringów w zapytaniach można używać apostrofy lub cudzysłowy. W SQLite dozwolone są jedynie apostrofy, a w dodatku używanie ich nie jest tak proste. W większości baz dla zaszycia apostrofa w stringu wystarczy użyć backslasha, natomiast w SQLite należy użyć apostrofa. Jeśli chcemy wstawić do bazy jakiś tekst, który zawiera w sobie apostrof, to musimy go poprzedzić kolejnym apostrofem.
Dobrym sposobem na zabezpieczenie się przed atakami typu SQLInjection jest przejechanie tablic $_GET i $_POST funkcją stripslashes, a później funkcją addslashes. Wiele osób zastanawia się, po co używać funkcji stripslashes. Niestety w pewnych okolicznościach backslashe dodawane są automatycznie przy wysłaniu żądania. Jeśli w takim wypadku użyjemy funkcji addslashes, to wynikiem tego będą niepożądane backslashe.
Po wstawieniu do zapytania przygotowanego w ten sposób stringa, baza danych SQLite zwróci błąd. Aby temu zapobiec, trzeba użyć funkcję sqlite_escape_string.
Następnym problemem są inserty. W MySQL można było wpakować do bazy niezliczoną ilość rekordów w jednym zapytaniu. W SQLite takiej możliwości nie ma. Można dodać jedynie jeden rekord w jednym poleceniu INSERT. Wyjątkiem jest tutaj składnia INSERT SELECT. Jednak gdyby ta zasada tyczyła się również tej składni, to wszyscy bardzo szybko spisaliby bazę danych SQLite na straty.
Baza danych SQLite doskonale nadaje się jako baza dla takich projektów jak np ministrony, squeeze page lub katalogi, których potrzebujemy nie mało, a chcemy oszczędzić czas i nie bawić się w instalowanie i konfigurację. wystarczy stworzyć projekt, który jest już odpowiednio skonfigurowany i wgrać go na wybrany serwer. To wszystko za sprawą umieszczenia całej bazy w jednym pliku.
A teraz krótkie podsumowanie z poprzedniego artykułu:
- Brak AUTO_INCREMENT – zamiennikiem tego jest składnia 'pole INTEGER PRIMARY KEY’
- Brak funkcji NOW()
- Inne składnia rozpoczynania transakcji – BEGIN zamiast START TRANSACTION
- Brak funkcji CONCAT() – zamiennikiem tej funkcji jest składnia 'slowo1′ || 'slowo2′ …
- Brak obsługi znaku `, który bardzo często jest dodawany przy eksportach w PhpMyAdminie
- W selektach składnia 'tabela.pole’ nie zwraca 'pole’, ale 'tabela.pole’ – ci którzy używają tablic asocjacyjnych do wyciągania wyników z bazy danych, będą musieli przerobić projekty lub poprawić to wyrażeniami regularnymi w klasie do obsługi bazy danych
Szerzej o wyrażeniach regularnych piszę w artykule Wyrażenia regularne – łatwiejsze niż myślisz. Wyrażenia regularne, to temat dość obszerny i dlatego postanowiłem napisać skrócony kurs na ten temat.
Baza danych SQLite jest dobrym rozwiązaniem dla ludzi, którzy nie maja możliwości zakładania i używania baz MySQL lub ograniczona jest ich ilość albo pojemność. Ta baza danych nadaje się głównie dla ludzi, którzy tworzą projekty od podstaw. Przesiadka z innej bazy danych na SQLite wiąże się z przeglądem wszystkich zapytań i ewentualną przeróbką. Jak już wspomniałem w poprzednim artykule na temat tej bazy, baza danych SQLite jest trzymana w jednym pliku i bardzo dobrze się nadaje do postawienia na niej jakiejś strony, którą można po prostu wrzucić na serwer i nie martwić się konfiguracją itp.