oxmysql para FiveM: qué es, errores comunes y la skill de IA

Ver en skills.sh

¿No quieres gestionar las skills tú mismo? Consigue la app completa.

oxmysql es la librería de base de datos para FiveM que sustituyó a mysql-async y ghmattimysql. Corre solo en el servidor, habla con MySQL o MariaDB y expone una API Lua pequeña bajo el global MySQL. Si tu recurso guarda algo (datos de jugador, vehículos, inventarios, logs), esta es la capa contra la que escribes. El SKILL.md recomienda MariaDB sobre MySQL 8 por compatibilidad.

Qué te da oxmysql

El setup es una línea en fxmanifest.lua, colocada antes del resto de scripts de servidor: server_script '@oxmysql/lib/MySQL.lua'. A partir de ahí, la tabla MySQL está disponible en todos los scripts de servidor del recurso.

  • MySQL.query y MySQL.query.await: ejecutan cualquier sentencia. Un SELECT devuelve filas; el resto devuelve insertId o affectedRows.
  • MySQL.insert: inserta una fila y devuelve el nuevo insert id.
  • MySQL.update: actualiza filas y devuelve el número de filas afectadas.
  • MySQL.single: una fila o nil, la llamada correcta para “carga este jugador”.
  • MySQL.scalar: un valor de una fila y una columna, para contadores y saldos.
  • MySQL.prepare: sentencias preparadas solo con placeholders ?, más rápidas cuando repites la misma consulta muchas veces.
  • MySQL.rawExecute: ejecución cruda sin forma de resultado automática.
  • MySQL.transaction: varias consultas que se aplican o fallan juntas.

Todas las funciones reciben parámetros mediante placeholders ?. Los valores nunca van dentro de la cadena SQL. La referencia está en coxdocs.dev/oxmysql.

Errores comunes con oxmysql

  • Usar la API de mysql-async. MySQL.Sync.fetchAll y MySQL.Async.execute vienen de una librería que ya no se mantiene. En código nuevo fallan o dependen de una capa de compatibilidad que no controlas. Usa MySQL.query.await, MySQL.insert y el resto de la API de oxmysql.
  • Llamar a MySQL desde un script de cliente. La librería es solo de servidor. Un cliente no tiene acceso a la base de datos ni global MySQL. Pon la consulta en un script de servidor y entrega el resultado al cliente por un evento o un callback.
  • Concatenar valores en el SQL. 'SELECT * FROM users WHERE identifier = "' .. identifier .. '"' es una inyección esperando a ocurrir. Escribe MySQL.single.await('SELECT * FROM users WHERE identifier = ?', { identifier }).
  • Esperar una consulta por fila dentro de un bucle. Guardar 300 vehículos con MySQL.update.await dentro de un for son 300 viajes a la base de datos. Agrupa el trabajo en una sola sentencia cuando puedas, o envuelve el conjunto en MySQL.transaction.
  • Olvidar la línea de la lib en el manifest. El síntoma es “attempt to index a nil value (global ‘MySQL’)” en la primera consulta. Añade server_script '@oxmysql/lib/MySQL.lua' antes del resto de scripts de servidor.

Por qué los asistentes de IA se equivocan con oxmysql

Los asistentes genéricos han leído una década de scripts de FiveM, y la mayoría usa mysql-async. Pide “guardar el dinero del jugador” y recibes MySQL.Async.execute con el valor concatenado en la cadena, a veces dentro de un archivo de cliente. No corre en ningún sitio, o peor, corre y deja el servidor abierto a inyecciones.

La skill de oxmysql da al asistente un archivo de reglas por función: placeholders.md, query.md, insert.md, prepare.md, update.md, single.md, scalar.md, rawExecute.md y transaction.md. Cada uno indica qué devuelve la función y cómo se pasan los parámetros. El asistente lee la regla que coincide con tu petición y escribe código que usa la API real en el lado correcto de la red.

Instala la skill de oxmysql en 30 segundos

  1. Haz clic en “Download SKILL.md” en la parte superior de esta página.
  2. Descomprímelo en la carpeta de skills o rules de tu herramienta de IA. La sección de instalación de abajo muestra la ruta exacta para Claude Code, Cursor y VS Code.
  3. Pide al asistente algo concreto, como “carga el saldo bancario de un jugador por identifier”, y comprueba que usa MySQL.scalar.await con un placeholder ? en un script de servidor.

Cómo instalar esta skill

Descarga el zip, descomprímelo y coloca la carpeta donde tu herramienta carga skills o reglas. La ruta exacta depende de la herramienta:

Claude Code

Descomprime en .claude/skills/oxmysql/ dentro del proyecto (la carpeta debe contener SKILL.md). Para todos los proyectos, usa ~/.claude/skills/oxmysql/.

Documentación de skills de Claude Code

Cursor

Cursor carga las reglas del proyecto desde .cursor/rules/. Añade ahí un archivo de regla que apunte a la skill descomprimida, o pega el contenido de SKILL.md y los archivos de reglas en una regla. El formato es .mdc con frontmatter y cambia entre versiones, así que revisa la documentación de tu versión.

Documentación de reglas de Cursor

VS Code / Copilot

Copilot lee archivos de instrucciones desde .github/instructions/*.instructions.md. Copia SKILL.md ahí con un glob applyTo para tus archivos Lua y deja los archivos de reglas al lado.

Documentación de instrucciones de VS Code

El archivo SKILL.md

Este es el archivo que lee tu asistente de IA. Enlaza a los archivos de reglas incluidos en la descarga.

Contenido de la skill (incluye SKILL.md y cualquier otro archivo)

El contenido de la skill está en inglés: es documentación técnica pensada para agentes de IA.

oxmysql

Server-side MySQL/MariaDB access for FiveM through the MySQL table (replacement for mysql-async and ghmattimysql).

Activation Contract

Load this skill when the user writes or edits database code in a FiveM resource: SELECT/INSERT/UPDATE/DELETE, upserts, transactions, MySQL.*, exports.oxmysql, or migrating from mysql-async.

Hard Rules

  • Server only. Add server_script '@oxmysql/lib/MySQL.lua' to fxmanifest.lua above other server scripts.
  • MySQL.Sync.* and MySQL.Async.* (mysql-async compatibility layer) are NOT available. Replace them with MySQL.query, MySQL.scalar, MySQL.single, MySQL.insert, MySQL.update, MySQL.prepare, MySQL.transaction, each with a .await variant.
  • @named placeholders are deprecated: use positional ? with an array of values. prepare accepts only ? (and ?? for column names).
  • Never concatenate user input into SQL; every value goes through a placeholder.
  • Every function takes (query, params, callback); use .await to yield instead of nesting callbacks.
  • Use transaction when several writes must succeed or fail together; it rolls back on any failure.
  • Use rawExecute only when the normalized result shape of query/prepare is insufficient.
  • Prefer MariaDB over MySQL 8 for compatibility.

Decision Gates

Need Call Returns
Many rows MySQL.query.await(sql, params) array of rows
One row MySQL.single.await(sql, params) row or nil
One value (COUNT, one column) MySQL.scalar.await(sql, params) value or nil
Insert MySQL.insert.await(sql, params) insert id
Update / delete count MySQL.update.await(sql, params) affected rows
Hot path, repeated statement MySQL.prepare.await(sql, params) rows / value
Several statements atomically MySQL.transaction.await({ { query, values }, ... }) success boolean
Raw, unnormalized result MySQL.rawExecute.await(sql, params) raw result

Execution Steps

  1. Confirm the manifest line and that oxmysql starts before the resource.
  2. Pick the function by result shape from Decision Gates.
  3. Write the SQL with backticked identifiers and ? for every value.
  4. Wrap multi-statement writes in transaction.
  5. Handle nil results (single, scalar) before use.

Output Contract

Return runnable server-side Lua (or JS) using MySQL.<fn>.await with positional placeholders and no mysql-async syntax.

References

  • rules/placeholders.md — ? placeholders, deprecated @named.
  • rules/query.md — MySQL.query: rows or insertId/affectedRows.
  • rules/single.md — MySQL.single: one row or nil.
  • rules/scalar.md — MySQL.scalar: single value.
  • rules/insert.md — MySQL.insert: returns insert id.
  • rules/update.md — MySQL.update: returns affected rows.
  • rules/prepare.md — MySQL.prepare: prepared statements.
  • rules/transaction.md — MySQL.transaction: atomic multi-query.
  • rules/rawExecute.md — MySQL.rawExecute: raw result.

Upstream docs: https://overextended.dev/oxmysql

Preguntas frecuentes

¿oxmysql es gratis?
Sí. oxmysql es open source, lo mantienen los equipos de Overextended y CommunityOx y está publicado en GitHub. Puedes usarlo en cualquier servidor sin coste.
¿oxmysql funciona con ESX y QBCore?
Sí. Las builds actuales de ESX Legacy y QBCore incluyen oxmysql como capa de base de datos, así que cualquier script que escribas para esos frameworks puede usar MySQL.query, MySQL.insert y el resto de la API.
¿Puedo usar esta skill con ChatGPT?
Sí, con un paso manual. El SKILL.md es markdown plano, así que puedes pegarlo en la conversación como contexto. El soporte nativo de skills es para Claude Code, Cursor y VS Code.

Lecturas más largas del blog de FiveAI sobre el mismo tema.

Más skills