AI Core
Essentielsai-mysql

ai-mysql pour les développeurs

Les exports d’oxmysql auxquels répond ai-mysql, ce que renvoie chacun, les formes promise, l’enveloppe MySQL.lua et les events d’erreur.

Vous écrivez une ressource de style ai-* en TypeScript ? N’utilisez pas ai-mysql. Utilisez le paquet de base de données d’AI Core @aicore-fivem/mysql dans votre propre ressource (pas de passage par un export à chaque requête, tables typées). Voir Base de données. ai-mysql est destiné aux scripts Lua et JavaScript écrits pour oxmysql.

ai-mysql répond exactement à l’API d’oxmysql (signatures, règles des callbacks, formes des résultats), donc la documentation propre à oxmysql s’applique. Cette page liste ce à quoi il répond et les détails qui comptent.

L’utiliser depuis Lua

Chargez l’enveloppe d’oxmysql ; le chemin pointe vers ai-mysql :

fxmanifest.lua
server_script '@oxmysql/lib/MySQL.lua'
server.lua
-- Attend le résultat : à appeler dans un thread ou un gestionnaire d’event.
local row = MySQL.single.await('SELECT money FROM my_accounts WHERE owner = ?', { identifier })

-- Forme callback : n’attend pas.
MySQL.update('UPDATE my_accounts SET money = money - ? WHERE owner = ? AND money >= ?', { 100, identifier, 100 }, function(affected)
    if affected == 1 then print('paid') end
end)

Exports

Chaque export est côté serveur et répond sous exports['ai-mysql'] et exports.oxmysql. Chacun prend (query, params?, callback?) :

  • query : le texte SQL, avec des marqueurs ? ou des marqueurs nommés @name / :name.
  • params : un tableau pour ?, un objet pour les marqueurs nommés. Peut être omis ; le callback peut alors être le deuxième argument.
  • callback : appelé avec le résultat. Sans lui, l’appel s’exécute quand même.

Chaque export a aussi une forme promise <name>_async et <name>Sync (query_async(query, params) renvoie une Promise qui est rejetée en cas d’erreur).

ExportRépondÀ utiliser pour
queryles lignes (tableau d’objets) pour un SELECT, ou l’en-tête de résultat pour les autres instructionstout ; execute et fetch sont d’anciens alias
singlela première ligne, ou nullune ligne par clé
scalarla première colonne de la première ligne, ou nullun comptage, une valeur
insertl’id de la nouvelle ligne (insertId), ou nullINSERT
updatele nombre de lignes affectées, ou nullUPDATE, DELETE
preparerequête préparée (protocole binaire) ; INSERT répond l’id, UPDATE / DELETE les lignes affectées, SELECT la première ligne (ou sa seule valeur). Plusieurs listes de valeurs l’exécutent une fois chacune.la même requête de nombreuses fois
rawExecuterequête préparée avec les résultats complets, sans mise en formequand vous avez besoin du résultat brut
transactiontrue après un commit, false après un rollback (toujours via le callback)plusieurs instructions qui doivent toutes réussir
startTransactionune Promise de true après un commit, false après un rollbackune transaction avec de la logique entre les requêtes
storerend le texte de la requête au callbackancien code qui stockait des requêtes
isReadyboolean : le pool est ouvertvérifications au démarrage
awaitConnectionune Promise de true une fois connectéattendre au démarrage

transaction

Exécute plusieurs instructions sur une seule connexion ; toutes réussissent ou aucune.

Côté : serveur · Attend : non (répond via le callback ; transaction_async renvoie une Promise)

Signature
transaction(queries: Array<string | [string, unknown[] | object] | { query: string; values?: unknown[] | object; parameters?: unknown[] | object }>, params?: unknown[] | object, cb?: (committed: boolean) => void): void
Lua
local ok = MySQL.transaction.await({
    { query = 'UPDATE my_accounts SET money = money - ? WHERE owner = ?', values = { 100, from } },
    { query = 'UPDATE my_accounts SET money = money + ? WHERE owner = ?', values = { 100, to } },
})

Paramètres

Prop

Type

Retour

Rien directement ; le callback reçoit true ou false. Un rollback affiche l’erreur dans la console et déclenche oxmysql:transaction-error.

startTransaction

Ouvre une transaction et donne à votre fonction un utilitaire query lié à elle. Renvoyez false depuis votre fonction pour faire un rollback. Elle expire au bout de 30 secondes.

Côté : serveur · Attend : oui (Promise)

Signature
startTransaction(work: (query: (sql: string, params?: unknown[] | object) => Promise<unknown>) => Promise<boolean | void>): Promise<boolean>

Retour

Promise<boolean> : true après un commit. false quand votre fonction a renvoyé false, a levé une erreur, ou que les 30 secondes se sont écoulées.

Exemple

// Une ressource JavaScript ou TypeScript simple sans @aicore-fivem/mysql.
const db = exports.oxmysql;

async function pay(from: string, to: string, amount: number): Promise<boolean> {
  return db.startTransaction(async (query: (sql: string, params?: unknown[]) => Promise<any>) => {
    const res = await query("UPDATE my_accounts SET money = money - ? WHERE owner = ? AND money >= ?", [amount, from, amount]);
    if (res.affectedRows !== 1) return false; // pas assez d’argent : rollback
    await query("UPDATE my_accounts SET money = money + ? WHERE owner = ?", [amount, to]);
  });
}

Anciens noms d’exports

Ancienne ressourceNomsÉquivalent à
ghmattimysqlexecute, scalar, transaction, store (et executeSync, scalarSync, ...)query, scalar, transaction, store
mysql-asyncmysql_execute, mysql_insert, mysql_fetch_all, mysql_fetch_scalar, mysql_transaction, mysql_storeupdate, insert, query, scalar, transaction, store

Règles des callbacks et des erreurs

Elles suivent oxmysql :

  • Succès : le callback reçoit le résultat.
  • Échec avec une forme promise (ou .await en Lua) : la promise est rejetée avec le texte de l’erreur.
  • Échec avec un simple callback : l’erreur est affichée dans la console et le callback n’est pas appelé.

Events

oxmysql:error

Côté : serveur (local) · se déclenche quand une requête échoue.

Prop

Type

oxmysql:transaction-error

Côté : serveur (local) · se déclenche quand une transaction fait un rollback. Contenu { message: string, resource: string }.

on("oxmysql:error", (e: { query?: string; message: string; resource: string }) => {
  console.log(`[db] ${e.resource}: ${e.message} (${e.query ?? "?"})`);
});

Passez toujours les valeurs en paramètres, jamais en les concaténant dans le texte SQL. Une valeur venant d’un joueur placée directement dans le SQL lui permet d’exécuter ses propres requêtes.

Sur cette page