Veritabanı
postgres ve mysql — aynı yüzey, parametreli sorgular, havuzsuz bağlantı.
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#
$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:
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#
int→int, float→float, bool→bool, text→string, NULL→null, 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:
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 funcjoin, 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:
$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çenek | Anlamı |
|---|---|
charset | bağlantı karakter kümesi |
collation | karşılaştırma kuralı |
tls | "true", "skip-verify", "preferred" |
İki bilinçli fark var:
# 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.
$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.