ΠŸΡƒΡΠΊΠ°Π½Π΅ Π½Π° Ρ€Π΅Π»Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ‚Π° Π³Ρ€Π°Ρ„Π° Π‘Π£Π‘Π” EdgeDB 4.0

EdgeDB 4.0 Π²Π΅Ρ‡Π΅ Π΅ Π½Π°Π»ΠΈΡ‡Π΅Π½. Π’ΠΎΠΉ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° Ρ€Π΅Π»Π°Ρ†ΠΈΠΎΠ½Π½ΠΎ-Π³Ρ€Π°Ρ„ΠΎΠ² ΠΌΠΎΠ΄Π΅Π» Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π΅Π·ΠΈΠΊΠ° Π·Π° заявки EdgeQL, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° със слоТни ΠΉΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡ‡Π½ΠΈ Π΄Π°Π½Π½ΠΈ. ΠšΠΎΠ΄ΡŠΡ‚ Π΅ написан Π½Π° Python ΠΈ Rust (парсСр ΠΈ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΈ Π·Π° производитСлността части) ΠΈ сС разпространява ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·Π° Apache 2.0. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ сС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π° ΠΊΠ°Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΊΠ° към PostgreSQL. ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ са Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ Π·Π° Python, Go, Rust, .NET, Elixir ΠΈ TypeScript/Javascript. ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π΅Π½ΠΈ са инструмСнти Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄Π΅Π½ Ρ€Π΅Π΄ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π‘Π£Π‘Π” ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ изпълнСниС Π½Π° заявки (REPL).

ВмСсто ΠΌΠΎΠ΄Π΅Π» Π½Π° Π΄Π°Π½Π½ΠΈ, Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ, EdgeDB ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Π° систСма, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ. ВмСсто външни ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Ρ‡Ρ€Π΅Π· ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‚ΠΊΠ° Π·Π° опрСдСлянС Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΈΠΏΠΎΠ²Π΅Ρ‚Π΅ (Π΅Π΄ΠΈΠ½ ΠΎΠ±Π΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ свойство Π½Π° Π΄Ρ€ΡƒΠ³ ΠΎΠ±Π΅ΠΊΡ‚).

Ρ‚ΠΈΠΏ Π›ΠΈΡ†Π΅ { Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅: str; } Ρ‚ΠΈΠΏ Π€ΠΈΠ»ΠΌ { Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π³Π»Π°Π²ΠΈΠ΅: str; ΠΌΠ½ΠΎΠ³ΠΎ Π°ΠΊΡ‚ΡŒΠΎΡ€ΠΈ: Π›ΠΈΡ†Π΅; }

Π˜Π½Π΄Π΅ΠΊΡΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° ускоряванС Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° заявки. ΠŸΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ сС ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°Ρ‚ΠΎ силно въвСТданС Π½Π° свойства, ограничСния Π½Π° стойността Π½Π° свойствата, изчислСни свойства ΠΈ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΈ. Π₯арактСристикитС Π½Π° схСмата Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ EdgeDB, която донякъдС напомня Π½Π° ORM, Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° смСсванС Π½Π° схСми, ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° свойства ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° JSON.

ΠžΡΠΈΠ³ΡƒΡ€Π΅Π½ΠΈ са Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ инструмСнти Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° миграция Π½Π° схСма - слСд промяна Π½Π° схСмата, посочСна Π² ΠΎΡ‚Π΄Π΅Π»Π΅Π½ esdl Ρ„Π°ΠΉΠ», просто ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° β€œedgedb migration create” ΠΈ Π‘Π£Π‘Π” Ρ‰Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° Ρ€Π°Π·Π»ΠΈΠΊΠΈΡ‚Π΅ Π² схСмата ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Ρ‰Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° скрипт Π·Π° ΠΌΠΈΠ³Ρ€ΠΈΡ€Π°Π½Π΅ към Π½ΠΎΠ²Π° схСма. Π˜ΡΡ‚ΠΎΡ€ΠΈΡΡ‚Π° Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² схСмата сС прослСдява Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ.

Π—Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° заявки сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ ΠΊΠ°ΠΊΡ‚ΠΎ Π΅Π·ΠΈΠΊΡŠΡ‚ Π·Π° заявки GraphQL, Ρ‚Π°ΠΊΠ° ΠΈ собствСният Π΅Π·ΠΈΠΊ EdgeDB, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ адаптация Π½Π° SQL Π·Π° ΠΉΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡ‡Π½ΠΈ Π΄Π°Π½Π½ΠΈ. ВмСсто ΡΠΏΠΈΡΡŠΡ†ΠΈ, Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ заявката са Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎ структуриран Π½Π°Ρ‡ΠΈΠ½ ΠΈ вмСсто подзаявки ΠΈ JOIN, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° посочитС Π΅Π΄Π½Π° заявка Π½Π° EdgeQL ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Ρ€Π°Π· Π² Π΄Ρ€ΡƒΠ³Π° заявка. ΠŸΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ сС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈ Ρ†ΠΈΠΊΠ»ΠΈ.

select Movie { title, actors: { name } } filter .title = "The Matrix" insert Movie { title := "The Matrix Resurrections", actors := ( select Person filter .name in { 'Keanu Reeves', 'Carrie- Ан Мос", "Π›ΠΎΡ€ΡŠΠ½Ρ Π€ΠΈΡˆΠ±ΡŠΡ€Π½" } ) }

Π’ Π½ΠΎΠ²Π°Ρ‚Π° вСрсия:

  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° ΠΏΡŠΠ»Π½ΠΎΡ‚Π΅ΠΊΡΡ‚ΠΎΠ²ΠΎ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅, Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Ρ‡Ρ€Π΅Π· плъгина fts. Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΊΠΎΠΉΡ‚ΠΎ ΠΈ Π΄Π° Π΅ ΠΎΠ±Π΅ΠΊΡ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ с Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ индСкса fts::index, Π° Π·Π° Π΄Π° Ρ‚ΡŠΡ€ΡΠΈΡ‚Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° Ρ„Ρ€Π°Π·Π° срСд индСксирани Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈ, Π΅ прСдоставСна функцията fts::search(). Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ сС Π²Ρ€ΡŠΡ‰Π°Ρ‚ ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ΠΈ намСрСния ΠΎΠ±Π΅ΠΊΡ‚ ΠΈ Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ Ρ‚Π΅Π³Π»ΠΎ Π·Π° Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅. НапримСр: 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;
  • Π”ΠΎΠ±Π°Π²Π΅Π½ Π΅ Π½ΠΎΠ² Ρ‚ΠΈΠΏ Π΄Π°Π½Π½ΠΈ β€žmultirangeβ€œ. Π’ΠΎΠΉ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΈ ΠΎΡ‚ стойности, ΠΊΠΎΠΈΡ‚ΠΎ прСдставят ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΈ. ΠŸΡ€ΠΈΠΏΠΎΠΊΡ€ΠΈΠ²Π°Ρ‰ΠΈΡ‚Π΅ сС области Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° посочСнитС Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΈ сС Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ. Всички Π½Π°Π»ΠΈΡ‡Π½ΠΈ досСга Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ Π·Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΈ работят с Ρ‚ΠΈΠΏΠ° β€žmultirangeβ€œ. select multirange([range(8, 10)]) + range(1, 5) - range(3, 4);
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π° ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° удостовСряванС, Π·Π° Π΄Π° сС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏΡŠΡ‚ Π΄ΠΎ GraphQL ΠΈ EdgeQL ΠΏΡ€Π΅Π· HTTP.
  • Π—Π° Π΄Π° сС стартира услуга Π·Π° удостовСряванС, която Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ ΠΎΡ‚ СкзСмпляра Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΎ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ β€žauthβ€œ, ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‰ΠΎ OAuth ΠΈΠ»ΠΈ Π²Π»ΠΈΠ·Π°Π½Π΅ Ρ‡Ρ€Π΅Π· ΠΈΠΌΠ΅ΠΉΠ» ΠΈ ΠΏΠ°Ρ€ΠΎΠ»Π°.
  • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΎ Π΅ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ pgcrypto, ΠΊΠΎΠ΅Ρ‚ΠΎ прСдоставя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ hmac, gen_salt ΠΈ crypt Π·Π° Ρ…Π΅ΡˆΠΈΡ€Π°Π½Π΅ ΠΈ ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅. select ext::pgcrypto::digest('encrypt this', 'sha1');
  • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΎ Π΅ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ pg_trgm с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° опрСдСлянС Π½Π° сходство ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠ·ΠΎΠ²Π΅.
  • НаправСни са ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π° подобряванС Π½Π° производитСлността. ΠšΠΎΠ½ΡΡƒΠΌΠ°Ρ†ΠΈΡ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€ НамалСно с 40%. ΠšΠΎΠ΄ΡŠΡ‚ Π·Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π° заявки EdgeQL Π΅ прСнаписан Π½Π° Rust.
  • EdgeQL Π²Π΅Ρ‡Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΏΠΎ-ΠΏΠΎΠ·Π½Π°Ρ‚ синтаксис Π½Π° условни ΠΈΠ·Ρ€Π°Π·ΠΈ (if … then .. else …). Π’Π΅Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ условСн DML Π·Π° създаванС, Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ въз основа Π½Π° Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ условия. Π”ΠΎΠ±Π°Π²Π΅Π½ΠΈ са Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ to_bytes(), to_str(), enc::base64_encode ΠΈ enc::base64_decode. ΠšΠ»Π°ΡƒΠ·Π°Ρ‚Π° "when" Π²Π΅Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² Ρ‚Ρ€ΠΈΠ³Π΅Ρ€ΠΈ. 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');
  • Π”ΠΎΠ±Π°Π²Π΅Π½ Π΅ Π½ΠΎΠ² Π½Π°Ρ‡ΠΈΠ½ Π·Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π³Π»ΠΎΠ±Π°Π»Π½ΠΈ стойности към GraphQL заявки - вмСсто Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ ΠΏΠΎΠ»Π΅, Π²Π΅Ρ‡Π΅ Π΅ възмоТно Π΄Π° сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ въз основа Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π° __globals__.

    Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru
ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с DDoS Π·Π°Ρ‰ΠΈΡ‚Π°, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ ΡƒΠ΅Π± хостинг със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS Π°Ρ‚Π°ΠΊΠΈ, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster