[Tutorial] executeSQLQuery

  • MTA bietet zahlreiche Möglichkeit Daten zu speichern. Zum einen kann man Daten in normalen Dateien speichern, in XML's und in relationalen Datenbanken wie SQLite oder mySQL. Als ich mit Country Reallife angefangen habe, wusste ich rein garnichts über Datenbanken. Ich habe mir durch rumspielen und experimentieren und mithilfe der Leute hier ausm Forum mir dies erarbeitet. Ich baute ein Accountsystem über die AccountData Funktionen von MTA. Als es darum ging Spielerunabhängige Daten zu speichern stand ich dann vor einer Wand.

    Die Funktion "executeSQLQuery" ermöglicht den Zugriff (lesen, schreiben) auf die MTA interne SQLite Datenbank welche "registry.db" heißt.
    Wenn ihr euch nicht mit mySQL Server auseinandersetzen wollt oder erstmal mit etwas einfachen Anfangen wollt, ist das ein super Einstieg.

    Fangen wir an. Eine sehr große hilfe ist dieses Programm: http://sqlitebrowser.sourceforge.net/
    Die Datenbank ist leer und bevor etwas mit ihr geschehen kann, muss zunächst erstmal eine Tabelle und ein paar Spalten in die Datenbank geschrieben werden. Nun kommt unser executeSQLQuery zum Einsatz.

    Lua
    executeSQLQuery ("CREATE TABLE IF NOT EXISTS spieler (skin TEXT, x TEXT, y TEXT, z TEXT)")

    CREATE TABLE IF NOT EXISTS -- ganz Wichtig, es weist executeSQLQuery an was es zu tun hat zu dt. "Erstelle eine Tabelle aber nur wenn sie nicht existiert". Existiert die Tabelle schon wird sie nicht überschrieben bzw neu erstellt.
    Das was in den Klammern steht sind die Spalten unter denen ihr später Werte speichern könnt.
    TEXT ist wichtig das ihr es hinter eurem Spaltennamen schreibt. TEXT ist für String, REAL ist für eine Kommazahl, INTEGER ist für eine Ganzzahl.
    Es ist wichtig zu unterscheiden was für ein TYP in der Spalte gespeichert werden kann. Man kann alles mit TEXT machen
    aber Zahlen die gespeichert sind müssen dann per tonumber erst in eine Zahl konvertiert werden. Umständlich und
    vergisst man das einmal kann es zu Fehlern führen.
    Wenn alles glatt lief könnt ihr nun mit dem SQLDatabaseBrowser die .db öffnen und ihr seht die Tabelle und die Spalten.

    Da wir nun eine Tabelle samt Spalten haben wollen wir ja auch mal ein paar Sachen reinschreiben. Dafür brauchen wir wieder die Funktion
    executeSQLQuery.

    Lua
    local x, y, z = getElementPosition (pl)
    exeuteSQLQuery ("INSERT INTO spieler (skin, x, y, z) VALUES (3, ?, ?, ?)", x, y, z)

    INSERT INTO weist dem Query an das er in die Tabelle spieler gerne etwas reinschreiben soll.
    In den Klammern hinter dem Tabellennamen trägt man die Spalten ein in denen man etwas einfügen will.
    VALUES will nun die Werte haben. Die Werte stehen in der Reihnfolge wie die Spaltennamen:
    Spalte1, Spalte2, Spalte3, Spalte4 - Wert1, Wert2, Wert3, Wert4 / In Spalte1 wird Wert1 eingetragen usw.

    Eine besonderheit unter VALUES kann man nun einen fixen Wert eintragen wie ich es getan habe. In der Spalte skin
    wird die 3 eingetragen egal was kommt. Nun gehen wir weiter ein Wert soll unter x gespeichert werden.
    Da unter VALUES nun ein ? steht könnte man davon ausgehen das ein ? unter x gespeichert wird. Stimmt aber nicht.
    Die ? sind Platzhalter und wie oben geschrieben kann man nun die Platzhalter mit eigenen Variablen ersetzen.

    Weiter geht es mit DROP TABLE. Damit können wir Tables löschen.

    Lua
    executeSQLQuery ("DROP TABLE spieler").

    Die Table "spieler" müsst ihr einfach durch den Namen der Table ersetzen die ihr löschen wollt. DROP und CREATE TABLE IF NOT EXIST sind die einfachsten Anweisungen.

    Und weiter geht.

    Lua
    executeSQLQuery("DELETE FROM spieler WHERE owner = 'Shape'")


    Mit DELETE leiten wir ein Löschvorgang ein. DELETE löscht Zeilen, keine Spalten! WHERE ist wie immer dazu da etwas zu suchen.
    Man kann wie immer auch Shape durch ein ? ersetzen um dies später durch eine Variable füllen zu lassen.
    Wir löschen nun ii der Tabelle Spieler, nicht DIE Tabelle Spieler - dafür ist DROP da, eine Zeile in der sich die Spalte owner mit dem Inhalt Shape kreuzt.
    Wenn mehrere Zeilen vorhanden wo sich die Spalte owner mit dem Inhalt der Zeile Shape trifft, so werden beide gelöscht. Ggf werden dann die lücken geschlossen
    indem die Zeilen aufrücken. Easy oder?^^

    Ich habe euch bis jetzt gezeigt wie man Daten löscht, schreibt aber nicht wie man sie ausliest. Das kommt jetzt dran:

    Lua
    executeSQLQuery(SELECT owner, id, health FROM spieler WHERE owner = ?", "Shape")


    SELECT owner, id, health. Wir wollen also die Daten owner, id und health haben.
    FROM spieler. Wir wollen die Daten aus der Tabelle spieler haben.
    WHERE owner. Da wir nicht alle id's etc haben wollen sondern nur die von Shape
    suchen wir also wieder nach Shape der sich in der Spalte owner befinden soll.
    Man könnte den Inhalt abfragen über eine ipairs Schleife.

    Lua
    for _index, d in ipairs (executeSQLQuery(...)) do
    	--
    end


    _index ist der Index, d ist eine Table die man mit einer pairs Schleife durchgehen kann oder wenn man die Spaltennamen kennt die Werte rausgeben.
    Der Query wird als Ergebnis eine Table geben, diese ist numerisch indiziert.
    Gehen wir von dem Fall aus wir haben 100 User in der Datenbank. Wir möchten die Daten von Shape haben daher führen wir unseren Query aus.
    Wir haben statt Shape ausversehen Shape1 geschrieben. Der User Shape1 ist allerdings nicht in der Datenbank enthalten.
    Als Ergebniss bekommen wir dennoch eine Table, diese ist allerdings leer. Um zu überpüfen ob unsere Operation von Erfolg gekrönt wurde
    können wir mittels #[Table] im outputChatBox vergewissern wie hoch der Index ist. Ist er 0, so ist die Table leer.
    Gehen wir nun davon aus wir schreiben Shape richtig, allerdings hat Shape 2 Einträge in der Datenbank.
    Fragen wir als erstes den Index ab #[Table] so bekommen wir als Antwort 2.
    Da wir unseren Table aufbau kennen können wir die Daten ganz normal abfragen.
    table[1].owner wird wenn wir es auswerfen lassen Shape raushauen.
    table[2].owner wird auch Shape raushauen. DIe beiden Einträge unterschieden sich einzig und alleine dadurch das sie verschiedene ID's haben.

    Lua
    executeSQLQuery(SELECT owner, id, health FROM spieler WHERE owner = ? AND id = 1", "Shape")


    AND ist recht wichtig um bei der suche weiter zu differenzieren. Wir suchen nun nichnur
    in der Spalte owner nach Shape sondern gleichzeitig auch in der Spalte id nach 1.
    Sollte nun Shape gefunden werden aber id nicht 1 sein, wird weitergesucht.

    Als letztes kommen wir zum UPDATE.

    Lua
    executeSQLQuery("UPDATE spieler SET owner = ? WHERE owner = 'Shape'", "Shape1")


    In diesem Beispiel ändern wir einfach den Namen. In der Tabelle spieler wollen wir in der Spalte
    owner Shape durch Shape1 ersetzen. Das ? ist ein Platzhalter und wird durch den String: "Shape1" ersetzt.
    Mit dieser Methode ist es möglich Variablen in den Query einzubauen.

    Da ich das Tutorial schnell auf Arbeit geschrieben habe übernehme ich keine Haftung für eventuell enthaltene Rechtschreibfehler.
    Warum eventuell? Ich weiß genau da sind welche drin. ;D
    Rechtschreibfehler können mir gerne per PM geschickt werden, dies würde meine
    Arbeit erleichernt. Werde nämlich die Tage die gesamte Rechtschreibung überprüfen.

    Ihr habt Probleme mit executeSQLQuery oder einfach nur Fragen? Schickt mir eine PM und ich werde
    so schnell wie ich kann Antworten und euch helfen.

    17 Mal editiert, zuletzt von Shape (7. August 2013 um 11:32)

  • Dieses Thema enthält 25 weitere Beiträge, die nur für registrierte Benutzer sichtbar sind, bitte registrieren Sie sich oder melden Sie sich an um diese lesen zu können.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!