oxmysql para FiveM: o que é, erros comuns e a skill de IA

Ver no skills.sh

Não quer gerenciar as skills por conta própria? Obtenha o app completo.

oxmysql é a biblioteca de banco de dados para FiveM que substituiu o mysql-async e o ghmattimysql. Roda apenas no servidor, conversa com MySQL ou MariaDB e expõe uma API Lua pequena no global MySQL. Se o seu recurso guarda qualquer coisa (dados de jogador, veículos, inventários, logs), esta é a camada contra a qual você escreve. O SKILL.md recomenda MariaDB em vez de MySQL 8 por compatibilidade.

O que o oxmysql oferece

O setup é uma linha no fxmanifest.lua, colocada antes dos outros scripts de servidor: server_script '@oxmysql/lib/MySQL.lua'. A partir daí, a tabela MySQL fica disponível em todos os scripts de servidor do recurso.

  • MySQL.query e MySQL.query.await: executam qualquer instrução. Um SELECT retorna linhas; as demais retornam insertId ou affectedRows.
  • MySQL.insert: insere uma linha e retorna o novo insert id.
  • MySQL.update: atualiza linhas e retorna o número de linhas afetadas.
  • MySQL.single: uma linha ou nil, a chamada certa para “carregue este jogador”.
  • MySQL.scalar: um valor de uma linha e uma coluna, para contagens e saldos.
  • MySQL.prepare: instruções preparadas apenas com placeholders ?, mais rápidas quando você repete a mesma consulta muitas vezes.
  • MySQL.rawExecute: execução crua sem formato de resultado automático.
  • MySQL.transaction: várias consultas que são aplicadas ou falham juntas.

Todas as funções recebem parâmetros por placeholders ?. Os valores nunca entram na string SQL. A referência está em coxdocs.dev/oxmysql.

Erros comuns com oxmysql

  • Usar a API do mysql-async. MySQL.Sync.fetchAll e MySQL.Async.execute vêm de uma biblioteca que não é mais mantida. Em código novo, falham ou dependem de uma camada de compatibilidade que você não controla. Use MySQL.query.await, MySQL.insert e o resto da API do oxmysql.
  • Chamar MySQL de um script de cliente. A biblioteca é só de servidor. O cliente não tem acesso ao banco nem ao global MySQL. Coloque a consulta em um script de servidor e entregue o resultado ao cliente por evento ou callback.
  • Concatenar valores no SQL. 'SELECT * FROM users WHERE identifier = "' .. identifier .. '"' é uma injeção esperando para acontecer. Escreva MySQL.single.await('SELECT * FROM users WHERE identifier = ?', { identifier }).
  • Esperar uma consulta por linha dentro de um loop. Salvar 300 veículos com MySQL.update.await dentro de um for são 300 idas ao banco. Agrupe o trabalho em uma única instrução quando puder, ou envolva o conjunto em MySQL.transaction.
  • Esquecer a linha da lib no manifest. O sintoma é “attempt to index a nil value (global ‘MySQL’)” na primeira consulta. Adicione server_script '@oxmysql/lib/MySQL.lua' antes dos outros scripts de servidor.

Por que assistentes de IA erram com oxmysql

Assistentes genéricos leram uma década de scripts FiveM, e a maioria usa mysql-async. Peça “salvar o dinheiro do jogador” e você recebe MySQL.Async.execute com o valor concatenado na string, às vezes dentro de um arquivo de cliente. Não roda em lugar nenhum, ou pior, roda e deixa o servidor aberto a injeções.

A skill do oxmysql dá ao assistente um arquivo de regras por função: placeholders.md, query.md, insert.md, prepare.md, update.md, single.md, scalar.md, rawExecute.md e transaction.md. Cada um indica o que a função retorna e como os parâmetros são passados. O assistente lê a regra que corresponde ao seu pedido e escreve código que usa a API real do lado certo da rede.

Instale a skill do oxmysql em 30 segundos

  1. Clique em “Download SKILL.md” no topo desta página.
  2. Descompacte na pasta de skills ou rules da sua ferramenta de IA. A seção de instalação abaixo mostra o caminho exato para Claude Code, Cursor e VS Code.
  3. Peça ao assistente algo concreto, como “carregue o saldo bancário de um jogador pelo identifier”, e confira se ele usa MySQL.scalar.await com um placeholder ? em um script de servidor.

Como instalar esta skill

Baixe o zip, descompacte e coloque a pasta onde a sua ferramenta carrega skills ou regras. O caminho exato depende da ferramenta:

Claude Code

Descompacte em .claude/skills/oxmysql/ dentro do projeto (a pasta precisa conter SKILL.md). Para todos os projetos, use ~/.claude/skills/oxmysql/.

Documentação de skills do Claude Code

Cursor

O Cursor carrega as regras do projeto de .cursor/rules/. Adicione ali um arquivo de regra apontando para a skill descompactada, ou cole o conteúdo do SKILL.md e dos arquivos de regras em uma regra. O formato é .mdc com frontmatter e muda entre versões, então confira a documentação da sua versão.

Documentação de regras do Cursor

VS Code / Copilot

O Copilot lê arquivos de instruções em .github/instructions/*.instructions.md. Copie o SKILL.md para lá com um glob applyTo para os seus arquivos Lua e mantenha os arquivos de regras ao lado.

Documentação de instruções do VS Code

O arquivo SKILL.md

Este é o arquivo que o seu assistente de IA lê. Ele aponta para os arquivos de regras incluídos no download.

Conteúdo da skill (inclui SKILL.md e quaisquer outros arquivos)

O conteúdo da skill está em inglês: é documentação técnica feita 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

Perguntas frequentes

O oxmysql é gratuito?
Sim. O oxmysql é open source, mantido pelas equipes Overextended e CommunityOx e publicado no GitHub. Você pode rodar em qualquer servidor sem custo.
O oxmysql funciona com ESX e QBCore?
Sim. As builds atuais do ESX Legacy e do QBCore já vêm com oxmysql como camada de banco de dados, então qualquer script que você escreva para esses frameworks pode usar MySQL.query, MySQL.insert e o resto da API.
Posso usar esta skill com o ChatGPT?
Sim, com um passo manual. O SKILL.md é markdown puro, então você pode colar na conversa como contexto. O suporte nativo a skills é para Claude Code, Cursor e VS Code.

Leituras mais longas do blog da FiveAI sobre o mesmo tema.

Mais skills