Baza danych
@aicore-fivem/mysql, typowane tabele i ai-mysql dla skryptów zewnętrznych.
AI Core ma własny silnik bazy danych, @aicore-fivem/mysql. Każdy zasób ai-*, który używa bazy danych, uruchamia małą pulę we własnym procesie (bez przeskoku przez eksport przy każdym zapytaniu); ai-mysql zastępuje oxmysql, mysql-async i ghmattimysql, więc skrypty zewnętrzne zachowują swoje API.
Tabele
Zasób trzyma swoje tabele w sql/main.sql i instaluje je przy starcie:
createDatabaseTables(ResourceName, "sql/main.sql");Tworzy brakujące tabele i dodaje brakujące kolumny; nigdy nie usuwa ani nie zmienia istniejących. Każda tabela ma prefiks zasobu (ai_<name>_...), klucz główny i używa utf8mb4_unicode_ci.
Zapytania
Build generuje z SQL typy wierszy (resource/server/tables.ts). Proste zapytania z nich korzystają:
export const db = tables<Tables, TableInserts>();
const rows = await db.select("ai_garages_vehicles", ["id", "plate"], { owner }, { limit: 50 });Złączenia, zakresy, upserty i operacje masowe zostają zwykłym SQL z placeholderami:
await mysql.query("UPDATE ai_x SET count = count - ? WHERE id = ? AND count >= ?", [n, id, n]);Zasady
- Placeholdery dla każdej wartości; identyfikatory tylko ze stałej listy.
- Pieniądze to liczba całkowita, czasy to
DATETIMEw UTC, flagi toTINYINT(1). - Dane gracza są czytane raz przy wczytaniu i trzymane w pamięci; częste wartości zapisuje okresowy flush, krytyczne (pieniądze, przedmioty) jedno warunkowe polecenie lub transakcja.
- Zapisy masowe to jedno polecenie na porcję, nigdy jedno na wiersz.
- Każdy zasób, który używa bazy danych, potrzebuje
add_convar_permission <resource> read mysql_connection_stringwenv.cfg.