İçeriğe geç
LexerLangv0.1.0

Veritabanı

postgres ve mysql — aynı yüzey, parametreli sorgular, havuzsuz bağlantı.

LexerLang
use postgres

$db = new postgres({
    host: "localhost",
    port: 5432,
    user: "postgres",
    password: "postgres",
    database: "testdb"
})

$sonuc as array = []
with $db
    .query("SELECT * FROM users ORDER BY id ASC")
    .rows.to_array($sonuc)
end with

$db.close()
ÇağrıAnlamı
new postgres({...})bağlanır; user ve database zorunlu
$db.query($sql, ...)sorgu çalıştırır, $db.rows günceller, $db döner
$db.execute($sql, ...)satır döndürmeyen komut; etkilenen satır sayısını döner
$db.rows.to_array($dizi)satırları diziye ekler ve diziyi döner
$db.rows.length / .first()satır sayısı / ilk satır
$db.close() / $db.is_closed()kapatır / durum

Parametreler#

LexerLang
$db.query("SELECT name FROM users WHERE id = $1", 5)

Değerler parametre olarak gider, sorgu metnine yapıştırılmaz — tırnak içeren bir değer komuta dönüşemez. SQL için ayrı bir kaçışlama fonksiyonu yoktur, çünkü gerekmez. Çoklu deyim sürücü düzeyinde kapalıdır.

Parametrelerin kapsamadığı tek yer sütun adlarıdır:

LexerLang
security.identifier($sirala, ["ad", "fiyat"])

Havuz yok#

Her new postgres tek bir bağlantı açar. Sayfa her istekte yeniden çalıştığı için istek başına bir bağlantı açılır ve istek bitince otomatik kapatılır; aksi halde her istek bir bağlantı sızdırırdı.

Açılış çalıştırmasında açılan bağlantı programın kendi sorumluluğundadır.

Tip eşlemesi#

intint, floatfloat, boolbool, textstring, NULLnull, timestamp→ISO metin, uuid→standart uuid metni.

numeric metin olarak gelir. Kayan noktaya çevirmek hassasiyeti bozacağı için bu bilinçli bir tercihtir: bir para tutarının son kuruşunu kaybetmek, metin olarak taşımaktan pahalıdır.

Sonuçları sayfaya yazdırma#

Backtick bloğu bir ifadedir; içine for gibi bir deyim yazılamaz. Satırlar önce toplanır, sonra birleştirilir:

LexerLang
func satirlar($data) as string
    $rows as array = []

    for $row in $data
        $rows.add(`
            <tr>
                <td>` + $row.id + `</td>
                <td>` + $row.device_name + `</td>
            </tr>
        `)
    end for

    return `<table><tbody>` + $rows.join("") + `</tbody></table>`
end func

join, parçalardan biri ham HTML olduğunda ham HTML döner; araya giren veriler kaçışlanır — + operatörüyle aynı kural.

Veriyi JavaScript'e geçirmek için json.encode:

LexerLang
$doc.body.add(`
    <script>
        const veriler = ` + json.encode($data) + `;
    </script>
`)

MySQL#

mysql aynı yüzeyi kullanır; yapılandırma birebir aynıdır. Aynı çağrılar: query, execute, rows.to_array, rows.first, close, is_closed.

Ek seçenekAnlamı
charsetbağlantı karakter kümesi
collationkarşılaştırma kuralı
tls"true", "skip-verify", "preferred"

İki bilinçli fark var:

LexerLang
# postgres — numaralı
$db.query("SELECT * FROM urunler WHERE id = $1", 5)

# mysql — sırayla
$db.query("SELECT * FROM urunler WHERE id = ?", 5)

Parametre işareti veritabanı sözdiziminin parçasıdır; gizlemek sorgu metnini yeniden yazmayı gerektirirdi ve yanlış sonuç riski doğururdu.

LexerLang
$db.execute("INSERT INTO urunler (ad) VALUES (?)", "Deri Cüzdan")
out($db.last_insert_id)

last_insert_id yalnızca mysqlde vardır; postgres'te karşılığı INSERT ... RETURNING id ile query çağırmaktır.

Sırada#

Redis ve oturum.