Jump to content

[ TuT ] SQLite


Recommended Posts

  • Globální moderátor

SQLite

 


Zdravím pawneři,

Slyšel jsem, že se tu dost povídá o dubd nebo dini, ale ještě jsem nikde u nikoho nezaslechl o systém SQLite. SQLite je tedy systém databáze přímo vložené do SAMP. Nejsou teda nutné k tomu mít žádné pluginy. Tyto databáze mají teda suffix .db a vytvářejí se ve složce scriptfiles. SQLite je v SAMP nedokonalé a způsobují lagy když je na serveru 30 a více hráčů (srovnáno s MySQL), ale stejně vás s tím seznámím. Takže jestli se rozhodnete pro SQLite nebo MySQL to je na vás, funguje vlastně stejně, takže by vás toto mohlo zajímat. Mám teda osobně zkušenosti s SQLite a nemyslím si, že to je až tak špatné, pokud s tím umíte dobře pracovat. V tomhle TuTu vás jenom seznámím se základníma věcmi, takže jestli máte o tom hlubší zájem, tak je třeba najít nějaké weby co se zabývá přímo SQLite. Možná nevýhodou je, že pokaždé když chcete upravovat nějaké data, musíme mít SQLite EDITOR. Nenutím vás toto teda používat, je to jen aby jste také věděli, že něco takového v SAMP je. Jestli stále chcete zůstat u starého způsobu zapisování do souboru tak doporučuji QINI od QWERa.

 

V SQL editoru to potom bude vypadat nějak takto:

dbpwn.JPG

 

Při vytváření databáze se používá prefix "DB". Dále existuje pro SQLite prefix "DBResult", což ukládá výsledky vyvolání dotazu. Takže pro vytvoření databáze bude něco takového:

new DB:database; // vytvoření databáze
new DBResult:result; // vytvoření resultu, později vám ukážu na příkladě

 

Funkce


V SAMP SQLite má přesně 10 funkcí. Tady máte pojmy, příklady jsou na wiki

db_open(nazev[]) - Tato funkce otevírá "nazev" databázi, nejlépe se doporučuje hned při spuštění, takže OnGMInit/OnFSInit

db_close(nazev[]) - Tato funkce uzavře, takže zase, doporučuje se při OnGMExit/OnFSExit

db_free_result(DBResult:result) - Jak bych vám to řekl, uvolní prostě dotaz, který jste vyvolal.

db_num_rows(DBResult:result) - Tato funkce vám napíše kolik řádků (výsledků) to našlo v databázi při daném dotazu.

db_num_fields(DBResult:result) - To samé jako horní funkce, akorát zjišťuje pole v jednom řádku.

db_next_row(DBResult:result) - Šoupne to na další řádek (výsledek), při daném vyvolaném dotazu

db_fieldname(DBResult:result, field, str[], maxlength) - Vrací jméno pole z výsledku na daném dotazu.

db_get_field(DBResult:result, field, str[], maxlength) - Zjistí hodnotu v daném poli.

Db_get_field_assoc(DBResult:result, const field[], str[], maxlen) - Zjistí zase hodnotu z pole přes název. To horní bylo přes ID pole, teď přes jména pole.

Db_get_field_assoc(DBResult:dbresult, const field[], str[], maxlen) - Zjistí zase hodnotu z pole přes název. To horní bylo přes ID pole, teď přes jména pole.

db_query(DB:db, query[]) - Tahle funkce je teda asi nejvíc použivaná vzhledem k tomu, že to je funkce, která vyvolá dotaz.


 

Začínáme s naší první databázi a tabulkou

new DB:database; // nadefinovali jsme tedy databázi s jménem database

Máme teda vytvořenou databázi, resp. název ze kterého budeme využívat celý tento SQLite v pawnu. Nyní tuto databázi musíme nějak otevřít, takže půjdeme jak jsem se už nahoře zmínil, v OnGMinit/OnFSInit.

database = db_open("data.db"); // do database jsme vložili ID "data.db", které se bude nacházet ve složce ScriptFiles

Takže jsme už vytvořili naši databázi, není třeba ji nějak vytvořit předem, tato funkce ji vytvoří samo. Problém je teď, že v té databázi je prázdno. Takže pod tím vyvoláme dotaz, které nám pomůže vytvořit tabulku v databázi.

new DBResult: result;
result = db_query(database,"CREATE TABLE IF NOT EXISTS Tabulka1 (Nick VARCHAR(25),AdminLevel INTEGER, Kills INTEGER, Death INTEGER)");//

Takže si nejdřív vysvětlíme co to je CREATE TABLE IF NOT EXISTS, znamená to, že vám to vytvoří tabulku v databázi, když neexistuje. Takže se to vykoná jen jednou vlastně. Další věc, VARCHAR nám označuje teda znaky, a v závorce počet znaků. INTEGER je tedy číselný data typ. Výborně, takže máme naši první tabulku. Akorát zase, je prázdná, je tam jen struktura tý tabulky, ale nemáme v tom žádné data. Nakonec jen doplníme. Dále máme tam DBResult, což nám umožňuje další věci, například zjistit, jestli tento kód provedl.

if(!result) printf("Tento SQL Dotaz se neprovedl!");

Další krok, vyprázdníme result, takže použijeme funkci db_free_result

db_free_result(result);


 

Data types

Data typy jsou teda typy, které je třeba nastavit při vytváření tabulky, takže vás teda s nějakýma také seznámím, alespoň ty které se využívají běžně.

INTEGER - už z názvu se bude jednat o integer.
FLOAT - desetinné čísla.
BOOLEAN - true/false, v databázi se ukládá jako 1/0
TIME - čas
TIMESTAMP - vyvolá se přesný čas, kdy to zaregistruje vytvoření nového řádku.
VARCHAR(x) - počet znaků dosažené v x.

 


TABLE Statements

Momentálně teda něco řeknu, příklady tu snad nebudou to si domyslete už sami.

 

CREATE TABLE

Jak jsem dřív řekl, to teda vytvoří tabulku. Původní syntax CREATE TABLE-u je CREATE TABLE tabulka (pole1...pole9999)

 

ALTER TABLE

Toto se teda používá k upravování existujicí tabulky, například jestli chcete pojmenovat jinak, přidat další pole, smazat existujicí pole atd. Tady asi bude třeba příklady aby jste tomu nějak porozuměli

 

Příklady:

ALTER TABLE Tabulka1 RENAME TO SuperTabulka;
ALTER TABLE Tabulka1 ADD PlayTime INTEGER
ALTER TABLE Tabulka1 MODIFY pole1 DataTyp // s tímto bohužel nemám zkušenosti.
ALTER TABLE Tabulka1 DROP COLUMN Deaths;

 

Vysvětlení:

První příklad nám tedy z Tabulka1 přejmenuje na SuperTabulka, Druhý příklad nám označuje přidání pole PlayTime s data typem INTEGER, bohužel teď nevím k čemu je teda MODIFY, nikdy jsem to nepoužíval a nemůžu k tomu teda nic říct. Podle webu to jen změní datatyp. Poslední příklad nám teda smaže pole Deaths z tabulky Tabulka1

 

DROP TABLE

Takže jen dodám, že toto klíčové slovo vám smaže tabulku z databáze.


 

Statements

Takže něco si řekneme o tomto, důležité je teda v pawnu vědět jen o pár klíčových slovech SELECT, INSERT, DELETE, UPDATE

 

SELECT

tedy pomáhá brát data z jednoho nebo více tabulek. Syntax SELECTu vypadá asi takto: "SELECT pole FROM tabulka WHERE podleceho". Teď vám ukážu pár příkladů, které bude navazovat na naší první tabulku.

 

Příklady:

SELECT * FROM Tabulka1 WHERE Nick='_NTP_HighPrint'
SELECT AdminLevel FROM Tabulka1 WHERE Nick='_NTP_HighPrint'
SELECT AdminLevel, Kills FROM Tabulka1 WHERE Nick='_NTP_HighPrint'
[color=#FF0000]POZOR:[/color] SELECT Tabulka1.AdminLevel, Tabulka2.Neco FROM Tabulka1, Tabulka2 WHERE Nick='_NTP_HighPrint'

 

Vysvětlení:

v prvním příkladu jsem tedy dal místo názvů polí hvězdičku, což znamená, že to bere vše co je v tom řádku s nickem _NTP_HighPrint, tedy v tomto případě nám bere Kills, AdminLevel, Nick a Deaths. Druhý příklad, to jsme vzali jen jedno pole což je AdminLevel. Další příklad je stejný, ale to nám bere 2 pole. A k poslednímu příkladu, to je tedy takovej speciální příklad, kde nám umožňuje vzít data z obou tabulek s jedním WHERE (nvm teď jak to nazvat).

 

INSERT

Klíčové slovo INSERT nám umožňuje vložit do databáze jednu nebo více dat. Syntax INSERTu je INSERT INTO tabulka (pole,pole2,pole3..pole999) VALUES (hodnota-pole,hodnota-pole2,hodnota-pole3...hodnota-pole999).

 

Příklad:

INSERT INTO Tabulka1 (Nick,AdminLevel,Kills,Death) VALUES ('_NTP_HighPrint',5,9999,0);

 

Vysvětlení:

Hmm, vloží teda do tabulky Tabulka1 hodnoty, jak vidíte nahoře, stringy se vždy dávají do ' ', a číselné hodnoty bez toho. Takže jsme vytvořili řádek s Nickem _NTP_HighPrint, Adminlevelem 5, Kills 9999 a Umrtí 0

 

UPDATE

Klíčové slovo UPDATE nám umožňuje aktualizovat hodnoty v dané tabulce. Syntax UPDATE-u je tedy takto: UPDATE tabulka SET pole WHERE neco

 

Příklad:

UPDATE Tabulka1 SET AdminLevel=6 WHERE Nick='_NTP_HighPrint'

 

Vysvětlení:

Takže jsme aktualizovali AdminLevel hráče s nickem _NTP_HighPrint na 6. Co na to dodat k tomuhle.

 

DELETE

Toto klíčové slovo nám umožňuje teda smazat jedno nebo více řadů z naší tabulky. Syntax tohoto klíčového slova je: DELETE FROM tabulka WHERE neco

 

Příklad:

DELETE FROM Tabulka1 WHERE Nick='_NTP_HighPrint'

 

Vysvětlení:

No snad toto je nejlehčí z klíčových slov, takže k tomu asi nemusím nic dodat, to snad už chápete.

 

Jak jste si asi všimli, u každých klíčových slov je vždy WHERE na konci. WHERE je tedy dodatek k SQL dotazu a to nám umožňuje filtrovat výsledek dotazu z klíčových slov.


 

Takže to je snad vše :). Z těchle věcí, byste mohli být schopni udělat registrační systém přes SQLite, ukládání a přepisování. Takže zatím hodně štěstí. Jestli jste něčemu nerozuměli, neváhejte napsat.

Jestli jste se s tímhle už seznámili, a víte, že mi něco chybí nebo mám špatně, tak mi to tady dole můžete opravit.

  • Líbí se mi to! (+1) 2
Link to comment
Share on other sites

Návod pěkný :thumbup:, ale podle mě to tady nikdo nevyužije (krom toho že bude vědět o čem je SQLite apd.), protože jak sám jsi řekl, laguje to při těch 30 hráčích a navíc, kdo nemá zkušenosti s SQL tak mu to příjde až moc složitý.

Link to comment
Share on other sites

  • Globální moderátor

Vyvolané 100 dotazů na dané klíčové slovo

INSERT:  5715ms
SELECT: 13ms (beze filtru WHERE je stejný výsledek)
UPDATE: 53ms (beze filtru WHERE 6079ms)
DELETE: 42ms (beze filtru WHERE  5934ms)

 

Takže to je poměrně rychlé, vzhledem k tomu, že INSERT se vyvolá jen jednou za čas třeba při registru. A navíc nějak mě překvapuje, že beze filtru to trvá déle než s filtrem :d

Link to comment
Share on other sites

  • 1 month later...

Je možné to použiť aj na čítanie na webe..napr. keby chcem profil na webe tak či je to schopné nejako vyčítať

 

// Viem, že je to stará téma ale nebudem zakladať novú

Link to comment
Share on other sites

MartiN":47itpdq5]Je možné to použiť aj na čítanie na webe..napr. keby chcem profil na webe tak či je to schopné nejako vyčítať

 

// Viem, že je to stará téma ale nebudem zakladať novú

Melo by to jit:)

Link to comment
Share on other sites

MartiN":3uumhgnl]Je možné to použiť aj na čítanie na webe..napr. keby chcem profil na webe tak či je to schopné nejako vyčítať

 

// Viem, že je to stará téma ale nebudem zakladať novú

Melo by to jit:)

 

 

Uhm a si schopný mi to nejako popísať ? :d

Link to comment
Share on other sites

MartiN":96yeb6ds]
MartiN":96yeb6ds]Je možné to použiť aj na čítanie na webe..napr. keby chcem profil na webe tak či je to schopné nejako vyčítať

 

// Viem, že je to stará téma ale nebudem zakladať novú

Melo by to jit:)

 

 

Uhm a si schopný mi to nejako popísať ? :d

No.. princip je takový, že přečteš obsah .db souboru a s ním pak pracuješ v PHP.. zbytek je na tobě :d Neumím s tím, ani jsem to nijak zvlášť nestudoval. :wtf:

Link to comment
Share on other sites

  • Administrátor
MartiN":g4uapclf]
MartiN":g4uapclf]Je možné to použiť aj na čítanie na webe..napr. keby chcem profil na webe tak či je to schopné nejako vyčítať

 

// Viem, že je to stará téma ale nebudem zakladať novú

Melo by to jit:)

 

 

Uhm a si schopný mi to nejako popísať ? :d

No.. princip je takový, že přečteš obsah .db souboru a s ním pak pracuješ v PHP.. zbytek je na tobě :d Neumím s tím, ani jsem to nijak zvlášť nestudoval. :wtf:

V PHP ? snad v PWN ne?:d

Link to comment
Share on other sites

  • Globální moderátor

Thx to all :)

 

Ty kravo tak tomu rikam TUT :o

20/10 :v:

Jak dlouho si to psal? :d

 

Co já vím, asi hodinu? :d

 

MartiN":3d50z12w]Je možné to použiť aj na čítanie na webe..napr. keby chcem profil na webe tak či je to schopné nejako vyčítať

 

// Viem, že je to stará téma ale nebudem zakladať novú

 

Je to možné :), nezkoušel jsem to, ale zkusit to mohu :d

Link to comment
Share on other sites

  • Globální moderátor

Vždyť pokud pochopíte jak to funguje tak není složité udělat registračku. Jako můžu to udělat no, ale je to popsané tak aby pokročilý mohli z toho udělat registračku :d

Až budu mít čas tak to sem šoupnu :)

 

Otravováním na SZ Nepomůže!! :d

Link to comment
Share on other sites

Vždyť pokud pochopíte jak to funguje tak není složité udělat registračku. Jako můžu to udělat no, ale je to popsané tak aby pokročilý mohli z toho udělat registračku :d

Až budu mít čas tak to sem šoupnu :)

 

Otravováním na SZ Nepomůže!! :d

si si istý ? btw ja som na ofik fore našiel registráciu... ale ja ju chcem od teba :-* (btw aj tak SQLite nepoužijem xD)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...