Skocz do zawartości
Minokon

SQLite - co to? Funkcje, polecenia, typy, przykłady.

Rekomendowane odpowiedzi

Witam

Ponieważ nie znalazłem żadnego polskiego poradnika na temat SQLite, uznałem że można by było taki napisać.

Nie wiem czy dobry dział, ale jest dział tylko dla MySQL, a SQLite to coś innego, chociaż podobne

Słowniczek:

  • SQLite - system korzystający z technologii SQL. Podobny do MySQL, tyle że zapisuje dane do pliku, a nie jak MySQL, gdzieś na serwerze. Nie wymaga żadnych dodatkowych serwerów, nazw użytkownika czy innych tego typu rzeczy. W przypadku SA-MP, to po prostu jeden plik w folderze "scriptfiles" który może zawierać duże ilości danych.
  • baza - baza danych SQLite
  • zapytanie - "odwołanie" do bazy danych, wykonanie jakiejś czynności na bazie.
  • tabela - zbiór danych, podzielonych na wiersze, a te na pola.
  • wiersz - po angielsku "row", czyli jeden wynik z tabeli.
  • pole - część wiersza, ma określoną nazwę.
  • wynik - po angielsku "result". Wynik to po prostu lista i zawartość wierszy pobranych w zapytaniu.

Funkcje:

db_open

Funkcja otwiera bazę danych. Zwraca "handle", dzięki któremu można będzie zidentyfikować bazę.

Ma jeden argument, nazwę bazy danych (UWAGA: trzeba dodać rozszerzenie .db).

db_close

Funkcja zamyka bazę danych. Nie zwraca żadnej specyficznej wartości.

Ma jeden argument, "handle" bazy którą chcemy zamknąć.

db_query

Podstawowa funkcja. Pozwala na wykonywanie poleceń do bazy. Więcej o poleceniach w dalszej części poradnika. Funkcja zwraca identyfikator wykonanego zapytania. Ma dwa argumenty:

  • DB:db - "handle" bazy, na której ma zostać wykonane zapytanie.
  • query[] - zapytanie SQL, które ma zostać wykonane.

db_free_result

Funkcja czyści bufor bazy danych. Używać po zakończeniu pracy z wynikami z db_query. Nie zwraca żadnej specyficznej wartości. Ma jeden argument, czyli identyfikator wykonanego zapytania.

db_num_rows

Funkcja zwraca ilość wyników, po użyciu funkcji db_query. Ma jeden argument, identyfikator wykonanego zapytania. Zwraca ilość wyników w bazie, po użyciu db_query i zapytania SQL: "SELECT".

db_next_row

Funkcja umożliwia "przełączanie" się pomiędzy wynikami. Jeśli db_num_rows zwróci więcej niż 1, możemy się przełączać między wynikami. Zawsze pierwszy wynik, jest na pierwszym miejscu, po użyciu db_next_row, przerzucimy się na drugi wynik (o ile istnieje), potem na trzeci itd. Funkcja nie zwraca specyficznej wartości. Ma jeden argument, identyfikator wykonanego zapytania SQL, zawierającego: "SELECT".

db_num_fields

Funkcja służy do zliczania liczby pól w danym wyniku z bazy. Ma jeden argument, identyfikator zapytania SQL, zawierającego "SELECT".

db_field_name

Funkcja służy do pobierania nazwy danego pola. Musimy podać jego numer. Zwraca nazwę danego pola.

Ma aż cztery argumenty:

  • DBResult:dbresult - identyfikator zapytania wykonanego na bazie danych, zawierającego "SELECT"
  • field - numer pola. jak użyjemy "SELECT Name,Password,Ip FROM..." to "Name" będzie miało numer 0, "Password" numer 1, a "Ip" numer 2.
  • result[] - zmienna, do której ma zostać zapisany ciąg znaków (nazwa pola).
  • maxlength - maksymalna długość pola. UWAGA: pole wymagane, nie ma ustawionej domyślnej wartości.

db_get_field

Funkcja służy, do pobierania zawartości danego pola. Nie zwraca specyficznej wartości. Ma cztery argumenty:

  • DBResult:dbresult -  identyfikator zapytania wykonanego na bazie danych, zawierającego "SELECT"
  • field  - to samo co w funkcji db_field_name
  • result[] - zmienna, do której ma zostać zapisany ciąg znaków (zawartość pola). Jeśli zawartością będzie zwykła liczba, trzeba będzie ją przekonwertować z ciągu znaków. Tak samo jak z liczbą Float.
  • maxlenght - to samo co w funkcji db_field_name

db_get_field_assoc

Funkcja służy do tego samego co funkcja wyżej, z jedną różnicą. Zamiast identyfikatora pola ("field"), podajemy ciąg znaków z nazwą pola ("field[]"). Może to nam ułatwić zadanie. Funkcja nie zwraca specyficznej wartości.

db_exists

Nie ma funkcji na sprawdzanie czy baza istnieje. Jednakże można ją w łatwy sposób zrobić.

Wystarczy wkleić podany kod do swojego skryptu, lub do samego include a_sampdb.inc

#define db_exists(%0) fexist(%0)
Polecenia: Poleceń w SQL jest bardzo dużo. Opiszę najważniejsze i najbardziej przydatne. SELECT Podstawowe polecenie. Służy do pobierania danych z bazy. Musimy określić, skąd ma pobrać wyniki. Możemy też określić czy ma wybierać jakieś wyjątkowe wyniki. Przykłady użycia "SELECT":
SELECT * FROM `Nazwa_tabeli`
Ten przykład pobierze wszystkie wyniki z danej tabeli.
SELECT * FROM `Nazwa_tabeli` WHERE `Name`='Minokon'
Ten przykład pobierze tylko wiersze, w których pole "Name" będzie miało wartość "Minokon". Jeśli będą dwa takie pola, wyświetli dwa. Będzie wtedy można się między nimi przełączać używając funkcji db_next_row.
SELECT `Deaths`, `Kills` FROM `Nazwa_tabeli` WHERE `Name`='Minokon'
Ten przykład zrobi to samo, co wyżej, tyle że pobierze tylko dwa pola z danego wiersza (wierszy). Znaczek "*" oznacza tyle co "wszystkie" i przy podaniu tego znaczku zamiast nazw pól, pobierze je wszystkie. INSERT To polecenie służy do dodania nowego wierszu do bazy danych. Używa się go w łatwy sposób. Przykłady użycia "INSERT":
INSERT INTO `Nazwa_tabeli` VALUES('Minokon', 'mino123', '0', '0');
Po wykonaniu takiego zapytania, w bazie danych pojawi się nowy wiersz, gdzie pierwsze pole (np. nick) będzie miało wartość "Minokon", drugie pole (np. hasło) będzie miało wartość "mino123", a trzecie i czwarte (np. staty) będą miały wartość 0. UPDATE To polecenie służy do "odświeżenia" pól w danym wierszu. Możemy podać konkretny wynik, inaczej wszystkie pola w tabeli dostaną taką samą wartość. Przykłady użycia "UPDATE":
UPDATE `Nazwa_tabeli` SET `Money`=1000
W powyższym przykładzie, wszystkim wierszom w danej tabeli, w polu "Money", zostanie przydzielona wartość "1000".
UPDATE `Nazwa_tabeli` SET `Money`=1000 WHERE `Name`='Minokon'
W tym przykładzie, wszystkim wierszom, gdzie pole "Name" będzie równać się "Minokon", zostanie przydzielona jedna wartość pola "Money", czyli "1000".
UPDATE `Nazwa_tabeli` SET `Ip`='127.0.0.1', `Money`=1000 WHERE `Name`='Minokon'
To samo co wyżej, tyle że dodatkowo ustawiamy zawartość pola "Ip". DELETE Odwrotność polecenia "INSERT". Przykłady użycia "DELETE":
DELETE FROM `Nazwa_tabeli`
To zapytanie wyczyściłoby całą tabelę z danych.
DELETE FROM `Nazwa_tabeli` WHERE `Name`='Minokon'
Ten przykład by usunął wszystkie wiersze, w których zawartość pola "Name" będzie miała wartość "Minokon". CREATE TABLE To polecenie służy do tworzenia tabeli. Przykłady użycia "CREATE TABLE":
CREATE TABLE `Accounts` ('Name' VARCHAR(30), 'Ip' VARCHAR(16), 'Deaths' SMALLINT(5), 'Kills' SMALLINT(5));
Powyższy przykład stworzy tabelę "Accounts" z czterema polami: Name, Ip, Deaths i Kills. Do każdego pola trzeba określić typ jego zawartości, więcej o typach w dalszej części poradnika. Do każdego pola trzeba także określić maksymalną długość jego wartości.
CREATE TABLE IF NOT EXISTS `Accounts` ('Name' VARCHAR(30), 'Ip' VARCHAR(16), 'Deaths' SMALLINT(5), 'Kills' SMALLINT(5));

To samo co wyżej, tyle że to polecenie stworzy tabelę, pod warunkiem że nie istnieje. Jeśli tabela już istnieje, polecenie nie zostanie wykonane kompletnie. Nie usunie aktualnej tabeli, nie stworzy nowej, ani nie zmieni zawartości już istniejącej.

Przykłady korzystania:

Wczytywanie pojazdów z bazy.

Oto przykład skryptu, który będzie wczytywał pojazdy z bazy danych.

Skrypt wstawiłem na pastebin, z powodu jego długości (nie chciałem aby poradnik wyglądał nieestetycznie).

http://pawn.pastebin.com/s03E4qFp

Dzięki temu, w mapie będziemy mieli parę linijek, to jest lepsze niż 500 linijek z pojazdami. Można także zrobić sobie konwerter z formatu "AddStaticVehicle(...)" od razu do bazy, dzięki temu nie będziemy musieli dodawać ich ręcznie programem do bazy.

Wczytywanie obiektów z bazy.

To samo co wyżej, tyle że wczytuje obiekty.

http://pawn.pastebin.com/CxPX2BvL

Typy pól:

Typ pól jest wiele, ale nie są w większości używane. Opiszę tylko te najważniejsze.

VARCHAR

Zwykły ciąg znaków. Nie za krótki, nie za długi (używaj CHAR dla krótkiego ciągu znaków i TEXT dla długiego).

INT

Pole do którego można zapisać liczbę (używaj SMALLINT dla małej liczby, lub BIGINT dla dużej).

DECIMAL

Pole do którego można zapisać liczbę zmiennoprzecinkową (Float). Przy podawaniu wielkości tego pola, podajemy dwie liczby: długość liczby przed przecinkiem, i długość po przecinku, np. ('PosX' DECIMAL(10,6), ...).

UWAGA: Pierwsza liczba definiująca maksymalną wielkość musi być większa od drugiej.

Program do edycji bazy SQLite

Znam jeden świetny program do edycji danych SQLite. Sam z niego korzystam. Umożliwia dodawanie nowych wierszy, zmianę wartości pól, wykonywanie zapytań itd.

Adres do sourceforge.net: http://sourceforge.net/projects/sqlitebrowser/

Zakończenie

To już koniec mojego poradnika. Dużo się nad nim napracowałem, ale mam nadzieję że ułatwi on korzystanie ze świetnego systemu do zapisu danych gracza, jakim jest SQLite. Np. można zapisać dane graczy, pojazdów, posiadłości, wyścigów i losowych pozycji do jednego pliku .db w folderze "scriptfiles" (wystarczy utworzyć parę tabel w jednej bazie danych).

Pozdrawiam, Minokon

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

szczerze mówiąc nie wiem jak sprawdzić czy dana tabela istnieje, nigdy z tego nie korzystałem

zawsze robię "CREATE TABLE IF NOT EXISTS" i tyle, na pewno istnieje

Pozdrawiam

P.S

dodałem przykłady i jedną funkcję

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dobry poradnik.

A mógłbyś powiedzieć jak zrobić Bank na takiej zasadzie? bo jak na razie bank mam jeszcze w tym starym dini.

Wpłacam tak:

dini_IntSet("Bankomat.ini", Name, dini_Int("Bankomat.ini", Name)+pieniadze);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

musisz najpierw pobrać dane, a potem dodać wartość wyższą o zmienną "pieniądze"

Heretyk, na stos ciebie trzeba... Zapytanie

format(query, 128, UPDATE `bankomat` SET `money`= `money`+ %d WHERE `login` = %s", pieniadze, Name);

To jest tylko fragment, ale prezentuje zasadę działania.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A mógłbyś wytłumaczyć jeszcze jak posługiwać się tym programem, oraz jak dodać coś do bazy ręcznie? Np. pojazd.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Uruchamiasz plik .db programem, wybierasz zakładkę "Browse Data", potem wybierasz tabelę, następnie klikasz "New Record", i zmieniasz wartości nowego rekordu, dwukrotnie klikając na pole (wyświetli się okienko). Jednym słowem: łatwizna, i nie ma po co tego opisywać (wystarczy trochę znać angielski).

Pozdrawiam, Minokon

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a mam pytanie, lepiej otworzyć raz bazę i ją edytować podczas gry (np. gdy gracz dostanie score to od razu zmienia w bazie) czy lepiej przy wejściu otwierać wczytywać dane zamykać i to samo przy wychodzeniu ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie wiem jak inni, ale ja tu za bardzo różnicy nie widzę

jednakże można porównać:

zmienne:

-szybkość (baza na pewno wolniejsza niż zmienne)

od razu:

-bezpieczeństwo (jak padnie serw, to dane się nie utracą)

to nie MySQL, na mysql'u praktycznie wymagane jest zapisywanie na zmiennych

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
to nie MySQL, na mysql'u praktycznie wymagane jest zapisywanie na zmiennych

Kto tak powiedział? Można robić na MySQL'u dynamicznie i jakoś serwer nie jest przeciążony..

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ja tak robiłem, i przy większej ilości graczy serwer MySQL po prostu padał a dane się traciły

zrobiłem na zmiennych, działa elegancko

Pozdrawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam pytanie - czy można dodawać nowe pola, jak się już stworzy tabelę?

Przykładowo - gdy w tabeli są pola np `nick`, `password`, to czy można dodać np. `job` ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

to chyba ALERT TABLE trzeba zrobić, ale niestety tego Ci nie wyjaśnię bo tego nie znam - nigdy nie używałem

"ALERT TABLE `nazwa_tabeli` ADD `job` SMALLINT(5) AFTER `password`" - coś takiego chyba, zobaczy czy zadziała

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chodzi o system animacji, to chyba tak...

CREATE TABLE `Anims` ('libary' VARCHAR(32), 'name' VARCHAR(32), 'cmd'  VARCHAR(16), 'data' SMALLINT(5));

Data to mogłyby być dodatkowe dane animacji (czy odtwarzać w pętli, czy zamrozić po zakończeniu itd.), które można by potem odczytywać za pomocą data & maska(np. 1 dla pierwszego bitu, 2 dla 2, 4 dla 3, 8 dla czwartego), hm ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam problem z tym ALERT. Utworzyłem tabele `properties` i zapomniałem dodać `price`.

próbowałem już:

ALERT TABLE `properties` ADD COLUMN `price` INT(8);

ALERT TABLE `properties` ADD `price` SMALLINT(5);

ALERT TABLE `properties` ADD `price` SMALLINT(5) AFTER `profit`;

itd.

Próbowałem ze średnikami, bez, w skrypcie i przez SQLite Browser (zawiszał się). Czyżby SQLite w SAMP nie obsługiwało tego. Zrobiłem wszystko według www.sqlite.org i Twoich podpowiedzi.

Jest możliwość dodawania kolumn w tym Browserze już po utworzeniu tabeli?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

trudno powiedzieć

sam także to sprawdzałem i nie działało, ale że nie było mi potrzebne to jakoś specjalnie nie szukałem błędu

SQLite w SA-MP jest takie same jak każde inne SQLite (w wersji 3). Przecież ten program (SQLite Browser) nie jest specjalnie przeznaczony dla SA-MP.

Mam propozycję, odpal bazę programem SQLite Browser, na górze jest taki przycisk "Modify Table" (taki ołówek na tle tabeli), wybierz bazę którą chcesz zedytować, a potem naciśnij przycisk "Add field" (jest w prawym dolnym rogu).

Wybierasz typ pola i jest, ale chyba nie da się ustalić jego maksymalnej długości.

Pozdrawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki, jesteś wielki. Nie mam pojęcie jak mogłem nie zauważyć tego Modify Table w SQLite Browser. Dziwi mnie tylko, że robi się coś według oryginalnej strony projektu SQLite i nie działa... A SQLite Browser zamiast wywalać błędy, zawiesza się... no nic, ważne, że problem rozwiązany. Jak uporam się z tymi domkami to chętnie wrzucę to na www.pawno.pl  ;D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ten program jakiś zarąbisty nie jest, ale chyba najlepszy z tych co znalazłem ;p

Wystarczy niepoprawne zapytanie wpisać i się zawiesza, zamiast wyświetlić błąd. Pewnie dlatego jego wersja to 2.0 beta1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przy niektórych błędach SQLite serwer crashuje się. Widocznie to wieszanie się to nie wina SQLite browsera, tylko silnika SQLite. Da się go pobrać na stronie www.sqlite.org i użyć w swoim programie... (Plik .cpp ma 100 000 linijek, z czego 90% to komentarze /* */  :P)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×