Datenbank
@aicore-fivem/mysql, typisierte Tabellen und ai-mysql für Skripte von Drittanbietern.
AI Core hat eine eigene Datenbank-Engine, @aicore-fivem/mysql. Jede ai-*-Ressource, die die Datenbank nutzt, betreibt einen kleinen Pool in ihrem eigenen Prozess (kein Export-Umweg pro Abfrage); ai-mysql ersetzt oxmysql, mysql-async und ghmattimysql, sodass Skripte von Drittanbietern ihre API behalten.
Tabellen
Eine Ressource hält ihre Tabellen in sql/main.sql und installiert sie beim Start:
createDatabaseTables(ResourceName, "sql/main.sql");Fehlende Tabellen werden angelegt und fehlende Spalten ergänzt; vorhandene werden nie gelöscht oder geändert. Jede Tabelle hat die Ressource als Präfix (ai_<name>_...), einen Primärschlüssel und nutzt utf8mb4_unicode_ci.
Abfragen
Der Build erzeugt aus dem SQL typisierte Zeilentypen (resource/server/tables.ts). Einfache Abfragen nutzen sie:
export const db = tables<Tables, TableInserts>();
const rows = await db.select("ai_garages_vehicles", ["id", "plate"], { owner }, { limit: 50 });Joins, Bereiche, Upserts und Massenanweisungen bleiben reines SQL mit Platzhaltern:
await mysql.query("UPDATE ai_x SET count = count - ? WHERE id = ? AND count >= ?", [n, id, n]);Regeln
- Platzhalter für jeden Wert; Bezeichner nur aus einer festen Liste.
- Geld ist eine Ganzzahl, Zeiten sind UTC-
DATETIME, Flags sindTINYINT(1). - Spielerdaten werden einmal beim Laden gelesen und im Speicher gehalten; häufige Werte schreibt ein periodischer Flush, kritische (Geld, Items) in einer bedingten Anweisung oder Transaktion.
- Massenschreibvorgänge sind eine Anweisung pro Block, nie eine pro Zeile.
- Jede Ressource, die die Datenbank nutzt, braucht
add_convar_permission <resource> read mysql_connection_stringinenv.cfg.