AI Core
Temelai-mysql

Geliştiriciler için ai-mysql

ai-mysql’in cevapladığı oxmysql export’ları, her birinin ne döndürdüğü, promise biçimleri, MySQL.lua sarmalayıcısı ve hata event’leri.

TypeScript ile ai-* tarzı bir resource mu yazıyorsun? ai-mysql kullanma. Kendi resource’unda AI Core’un veritabanı paketi @aicore-fivem/mysql’i kullan (sorgu başına export atlaması yok, tipli tablolar). Bkz. Veritabanı. ai-mysql, oxmysql için yazılmış Lua ve JavaScript script’leri içindir.

ai-mysql oxmysql’in API’sini birebir (imzalar, callback kuralları, sonuç şekilleri) cevaplar; bu yüzden oxmysql’in kendi dokümantasyonu geçerlidir. Bu sayfa neyi cevapladığını ve önemli ayrıntıları listeler.

Lua’dan kullanmak

oxmysql’in sarmalayıcısını yükle; yol ai-mysql’e çözülür:

fxmanifest.lua
server_script '@oxmysql/lib/MySQL.lua'
server.lua
-- Sonucu bekler: bir thread ya da event handler içinde çağır.
local row = MySQL.single.await('SELECT money FROM my_accounts WHERE owner = ?', { identifier })

-- Callback biçimi: beklemez.
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)

Export’lar

Her export server tarafındadır ve exports['ai-mysql'] ile exports.oxmysql altında cevap verir. Her biri (query, params?, callback?) alır:

  • query: ? yer tutucuları ya da adlandırılmış @name / :name yer tutucularıyla SQL metni.
  • params: ? için bir dizi, adlandırılmış yer tutucular için bir nesne. Verilmeyebilir; o zaman callback ikinci argüman olabilir.
  • callback: sonuçla çağrılır. O olmadan da çağrı çalışır.

Her export’un ayrıca bir promise biçimi vardır: <name>_async ve <name>Sync (query_async(query, params) hata olunca reddedilen bir Promise döndürür).

ExportCevapNe için kullanılır
querySELECT için satırlar (nesne dizisi), diğer ifadeler için sonuç başlığıher şey; execute ve fetch eski takma adlardır
singleilk satır ya da nullanahtarla tek satır
scalarilk satırın ilk sütunu ya da nullbir sayım, tek bir değer
insertyeni satırın id’si (insertId) ya da nullINSERT
updateetkilenen satır sayısı ya da nullUPDATE, DELETE
prepareprepared statement (binary protokol); INSERT id’yi, UPDATE / DELETE etkilenen satırları, SELECT ilk satırı (ya da tek değerini) cevaplar. Birden çok değer listesi her biri için bir kez çalıştırır.aynı sorgu defalarca
rawExecutetam, şekillendirilmemiş sonuçlarla prepared statementham sonuca ihtiyacın olduğunda
transactioncommit edilince true, rollback sonrası false (her zaman callback üzerinden)hepsi başarılı olması gereken birden çok ifade
startTransactioncommit edilince true, rollback sonrası false veren bir Promisesorgular arasında mantık olan bir transaction
storesorgu metnini callback’e geri verirsorguları saklayan eski kod
isReadyboolean: havuz açıkaçılışta kontroller
awaitConnectionbağlanınca true veren bir Promiseaçılışta bekleme

transaction

Birden çok ifadeyi tek bir bağlantıda çalıştırır; ya hepsi başarılı olur ya hiçbiri.

Taraf: Server · Bekler: hayır (callback üzerinden cevap verir; transaction_async bir Promise döndürür)

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 } },
})

Parametreler

Prop

Type

Dönüş değeri

Doğrudan hiçbir şey; callback true ya da false alır. Rollback hatayı konsola yazdırır ve oxmysql:transaction-error event’ini tetikler.

startTransaction

Bir transaction açar ve fonksiyonuna ona bağlı bir query yardımcısı verir. Rollback için fonksiyonundan false döndür. 30 saniye sonra zaman aşımına uğrar.

Taraf: Server · Bekler: evet (Promise)

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

Dönüş değeri

Promise<boolean>: commit edilince true. Fonksiyonun false döndürdüğünde, hata fırlattığında ya da 30 saniye dolduğunda false.

Örnek

// @aicore-fivem/mysql olmadan düz bir JavaScript ya da TypeScript resource’u.
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; // para yetmiyor: rollback
    await query("UPDATE my_accounts SET money = money + ? WHERE owner = ?", [amount, to]);
  });
}

Eski export adları

Eski resourceAdlarKarşılığı
ghmattimysqlexecute, scalar, transaction, store (ve 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

Callback ve hata kuralları

Bunlar oxmysql’i takip eder:

  • Başarı: callback sonucu alır.
  • Promise biçimiyle (ya da Lua’da .await ile) hata: promise hata metniyle reddedilir.
  • Düz callback ile hata: hata konsola yazdırılır ve callback çağrılmaz.

Event’ler

oxmysql:error

Taraf: Server (yerel) · bir sorgu başarısız olunca tetiklenir.

Prop

Type

oxmysql:transaction-error

Taraf: Server (yerel) · bir transaction rollback olunca tetiklenir. Yük { message: string, resource: string }.

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

Değerleri her zaman parametre olarak ver, asla SQL metnine ekleyerek değil. Bir oyuncudan gelen değer doğrudan SQL’e konursa oyuncu kendi sorgularını çalıştırabilir.

Bu sayfada