EdgeDB 4.0 har slÀppts, som implementerar en relationsgrafdatamodell och frÄgesprÄket EdgeQL, optimerat för att hantera komplexa hierarkiska data. Koden Àr skriven i Python och Rust (parsern och prestandakritiska delar) och Àr licensierad under Apache 2.0. Projektet utvecklas som ett tillÀgg ovanpÄ PostgreSQL. Klientbibliotek har skapats för sprÄken Python, Go, Rust, .NET, Elixir och TypeScript/Javascript. En kommandoradsverktyg erbjuds för att hantera databasen och interaktivt köra frÄgor (REPL).
IstÀllet för en tabellbaserad datamodell anvÀnder EdgeDB ett deklarativt system baserat pÄ objekttyper. IstÀllet för primÀrnycklar (foreign key) för att definiera relationen mellan typer, anvÀnds lÀnkbindningar (en objekt kan anvÀndas som en egenskap av ett annat objekt).
type Person { required name: str; } type Movie { required title: str; multi actors: Person; }
För att pÄskynda bearbetningen av frÄgor kan index anvÀndas. Funktioner som strikt typning av egenskaper, vÀrdebegrÀnsningar, berÀknade egenskaper och lagrade procedurer stöds ocksÄ. En speciell egenskap hos EdgeDB:s objektlagringsschema, som liknar ORM, Àr möjligheten att blanda scheman, koppla egenskaper frÄn olika objekt och integrerat stöd för JSON.
Inbyggda verktyg för schema-migrering tillhandahĂ„lls â efter att schemat har Ă€ndrats i en separat esdl-fil, rĂ€cker det med att köra kommandot "edgedb migration create", sĂ„ analyserar databasen skillnaderna i schemat och genererar interaktivt ett script för att migrera till det nya schemat. Historiken för schemaĂ€ndringar spĂ„ras automatiskt.
För att skapa frÄgor stöds bÄde GraphQL-frÄgesprÄk och det egna EdgeDB-sprÄket, som Àr en anpassning av SQL för hierarkiska data. IstÀllet för listor presenteras frÄgeresultaten i en strukturerad form, och istÀllet för underfrÄgor och JOIN-operationer ges möjligheten att ange en EdgeQL-frÄga som ett uttryck inom en annan frÄga. Transaktioner och loopar stöds.
vĂ€lja Film { titel, skĂ„despelare: { namn } } filter .titel = «The Matrix» infoga Film { titel := «The Matrix Resurrections», skĂ„despelare := ( vĂ€lj Person filter .namn i { âKeanu Reevesâ, âCarrie-Anne Mossâ, âLaurence Fishburneâ } ) }
I den nya versionen:
- Stödet för fulltextsökning har lagts till, implementerat via en modul för fts. För att omvandla vilket objekt som helst till ett sökbart dokument ska indexeringen fts::index anvĂ€ndas, och för att söka efter en specifik fras bland de indexerade dokumenten föreslĂ„s funktionen fts::search(). Resultaten returneras i form av tupler som innehĂ„ller det hittade objektet och dess sökvĂ€rde. Till exempel: type Item { required available: bool { default := false; }; required name: str; required description: str; index fts::index on ( fts::with_options( .name, language := fts::Language.eng ) ); } with res := ( select fts::search(Item, âcandy cornâ, language := âengâ) ) select res.object {name, score := res.score} order by res.score desc;
- En ny datatyp "multirange" har lagts till, som definierar en eller flera vĂ€rdeintervall för att representera avbrutna intervall. Normalisering av överlappande omrĂ„den i de angivna intervallen sker automatiskt. Alla tidigare tillgĂ€ngliga funktioner och operatorer för att hantera intervall kan anvĂ€ndas med "multirange". select multirange([range(8, 10)]) + range(1, 5) â range(3, 4);
- Stödet för autentisering har lagts till och Àr aktiverat som standard för att begrÀnsa Ätkomst till GraphQL och EdgeQL över HTTP.
- För att köra en autentiseringstjÀnst, som fungerar separat frÄn databasinstansen, har tillÀgget "auth" lagts till, som stödjer OAuth eller inloggning via e-post och lösenord.
- TillĂ€gget pgcrypto har lagts till, som erbjuder funktioner för hmac, gen_salt och crypt för hashing och kryptering. select ext::pgcrypto::digest(âencrypt thisâ, âsha1â);
- TillÀgget pg_trgm med funktioner för att bestÀmma likhet mellan strÀngar har lagts till.
- Optimeringar har genomförts som har ökat prestandan. Minnesförbrukningen har servern minskat med 40%. Koden för parsern av EdgeQL-frÄgor har omskrivits i Rust.
- EdgeQL-sprĂ„ket har fĂ„tt stöd för en mer bekant syntax för villkorsuttryck (if ⊠then .. else âŠ). Det har blivit möjligt att anvĂ€nda villkorsbaserad DML för att skapa, uppdatera och ta bort olika objekt baserat pĂ„ angivna villkor. Funktioner som to_bytes(), to_str(), enc::base64_encode och enc::base64_decode har lagts till. AnvĂ€ndning av uttrycket "when" Ă€r tillĂ„tet i triggers. select if count(Object) > 0 then âgot dataâ else âno dataâ; select (select User filter .name = âAliceâ) ?? (insert User { name := âAliceâ }); select enc::base64_encode(bâhelloâ);
- En ny metod för att överföra globala vĂ€rden till GraphQL-frĂ„gor har införts â istĂ€llet för att anvĂ€nda ett separat fĂ€lt, sĂ„ Ă€r det möjligt att överföra variabler baserat pĂ„ objektet __globals__.
KĂ€lla: opennet.ru
