
- ESX
- QBCore
- vRP
Por Luke

Mova um recurso de mysql-async para oxmysql alterando sua configuração de driver e revisando os parâmetros de cada consulta, valor de retorno e tratamento de erros. Uma migração de driver não exige a reescrita do seu esquema de banco de dados e não garante uma jogabilidade mais rápida.
Faça backup do banco de dados e dos recursos correspondentes, depois trabalhe em uma cópia isolada. Inventarie cada recurso usando mysql-async e verifique se seu framework já exige oxmysql. Registre a versão do driver instalado. Revise a fonte e instruções de instalação do oxmysql para essa versão antes de trocar os drivers.
In the active server.cfg, keep the existing private mysql_connection_string setting above ensure oxmysql. Inicie os recursos dependentes depois. Não publique credenciais de conexão em logs de suporte. Remova a inicialização do driver antigo somente depois que todos os recursos dependentes tiverem sido contabilizados.
Em cada recurso Lua que usa a MySQL global, carregue a biblioteca antes de seus scripts de servidor:
server_scripts {
'@oxmysql/lib/MySQL.lua',
'server/*.lua'
}
dependency 'oxmysql'Use MySQL.query.await para um conjunto de linhas, MySQL.single.await para uma linha, MySQL.scalar.await para um valor, MySQL.insert.await para um ID de inserção e MySQL.update.await para linhas afetadas. Verifique o retorno documentado para sua consulta; um resultado vazio é diferente de um erro.
Este exemplo executado no servidor testa uma consulta parametrizada e seu retorno sem acessar uma tabela de jogabilidade. Execute-o em um recurso depois que o oxmysql tiver iniciado:
CreateThread(function()
local ok, value = pcall(function()
return MySQL.scalar.await('SELECT ?', { 'connection-ok' })
end)
if ok and value == 'connection-ok' then
print('Database parameter check passed.')
else
print('Database parameter check failed; inspect the server log privately.')
end
end)Substituir valores de usuário interpolados por posicionais ? placeholders e uma tabela de parâmetros ordenada. Identificadores de tabela e coluna exigem uma lista fixa permitida; placeholders de valor não podem selecionar identificadores arbitrários SQL.
Await altera o fluxo de controle: use o resultado após o retorno do await, trate linhas ausentes e exceções, e verifique se o jogador ainda está conectado antes de agir. Uma gravação SQL bem-sucedida não atualiza automaticamente o estado do jogador em memória de um framework.
Use a transação documentada do motorista API para trabalho SQL agrupado. Separe START TRANSACTION, consulta e COMMIT as chamadas através de um pool de conexões não garantem que todas as instruções usem a mesma conexão.
Uma transação bem-sucedida significa que suas instruções SQL não falharam. Um UPDATE afetando zero linhas ainda pode ser SQL válido. A lógica de pagamento e inventário deve impor explicitamente as condições de negócios; não copie um trecho genérico de transferência de saldo para uma economia real.
Agende uma janela de manutenção, implante o conjunto de driver/recurso correspondente e execute as mesmas verificações. Mantenha o conjunto antigo privado para reversão. Restaure um backup de banco de dados somente se necessário para dados ou esquema alterados, e contabilize todas as gravações desde esse backup. Converter texto de volta para um conjunto de caracteres menor não é uma reversão genérica segura.





