Skip to content

Gel (المعروفة سابقًا بـ EdgeDB) هي قاعدة بيانات علائقية بيانية تعمل بواسطة Postgres في الخلفية. توفر لغة مخطط تصريحية ونظام ترحيل ولغة استعلام كائنية التوجيه، بالإضافة إلى دعم استعلامات SQL الخام. تحل مشكلة التوافق العلائقي الكائني على مستوى قاعدة البيانات، مما يلغي الحاجة إلى مكتبة ORM في كود التطبيق.


أولاً، قم بتثبيت Gel إذا لم تكن قد قمت بذلك بالفعل.

sh
curl https://www.geldata.com/sh --proto "=https" -sSf1 | sh
sh
irm https://www.geldata.com/ps1 | iex
sh
brew install geldata/tap/gel-cli

استخدم bun init لإنشاء مشروع جديد.

sh
mkdir my-gel-app
cd my-gel-app
bun init -y

سنستخدم سطر أوامر Gel لتهيئة مثيل Gel لمشروعنا. ينشئ هذا ملف gel.toml في جذر مشروعنا.

sh
gel project init
txt
No `gel.toml` found in `/Users/colinmcd94/Documents/bun/fun/examples/my-gel-app` or above
Do you want to initialize a new project? [Y/n]
> Y
Specify the name of Gel instance to use with this project [default: my_gel_app]:
> my_gel_app
Checking Gel versions...
Specify the version of Gel to use with this project [default: x.y]:
> x.y
┌─────────────────────┬──────────────────────────────────────────────────────────────────┐
│ Project directory   │ /Users/colinmcd94/Documents/bun/fun/examples/my-gel-app         │
│ Project config      │ /Users/colinmcd94/Documents/bun/fun/examples/my-gel-app/gel.toml│
│ Schema dir (empty)  │ /Users/colinmcd94/Documents/bun/fun/examples/my-gel-app/dbschema│
│ Installation method │ portable package                                                 │
│ Version             │ x.y+6d5921b                                                      │
│ Instance name       │ my_gel_app                                                       │
└─────────────────────┴──────────────────────────────────────────────────────────────────┘
Version x.y+6d5921b is already downloaded
Initializing Gel instance...
Applying migrations...
Everything is up to date. Revision initial
Project initialized.
To connect to my_gel_app, run `gel`

لمعرفة ما إذا كانت قاعدة البيانات تعمل، دعنا نفتح REPL ونشغل استعلامًا بسيطًا.

sh
gel
gel> select 1 + 1;
txt
2

ثم قم بتشغيل \quit للخروج من REPL.

sh
gel> \quit

مع تهيئة المشروع، يمكننا تحديد مخطط. أمر gel project init أنشأ بالفعل ملف dbschema/default.esdl ليحتوي على المخطط الخاص بنا.

txt
dbschema
├── default.esdl
└── migrations

افتح هذا الملف والصق المحتويات التالية.

ts
module default {
  type Movie {
    required title: str;
    releaseYear: int64;
  }
};

ثم قم بإنشاء وتطبيق ترحيل أولي.

sh
gel migration create
txt
Created /Users/colinmcd94/Documents/bun/fun/examples/my-gel-app/dbschema/migrations/00001.edgeql, id: m1uwekrn4ni4qs7ul7hfar4xemm5kkxlpswolcoyqj3xdhweomwjrq
sh
gel migrate
txt
Applied m1uwekrn4ni4qs7ul7hfar4xemm5kkxlpswolcoyqj3xdhweomwjrq (00001.edgeql)

مع تطبيق المخطط الخاص بنا، دعنا ننفذ بعض الاستعلامات باستخدام مكتبة عميل Gel لـ JavaScript. سنقوم بتثبيت مكتبة العميل و CLI لتوليد الكود الخاص بـ Gel، وإنشاء ملف seed.ts.

sh
bun add gel
bun add -D @gel/generate
touch seed.ts

الصق الكود التالي في seed.ts.

العميل يتصل تلقائيًا بقاعدة البيانات. نقوم بإدراج بعض الأفلام باستخدام طريقة .execute(). سنستخدم تعبير for الخاص بـ EdgeQL لتحويل هذا الإدراج الجماعي إلى استعلام محسن واحد.

ts
import { createClient } from "gel";

const client = createClient();

const INSERT_MOVIE = `
  with movies := <array<tuple<title: str, year: int64>>>$movies
  for movie in array_unpack(movies) union (
    insert Movie {
      title := movie.title,
      releaseYear := movie.year,
    }
  )
`;

const movies = [
  { title: "The Matrix", year: 1999 },
  { title: "The Matrix Reloaded", year: 2003 },
  { title: "The Matrix Revolutions", year: 2003 },
];

await client.execute(INSERT_MOVIE, { movies });

console.log(`Seeding complete.`);
process.exit();

ثم قم بتشغيل هذا الملف باستخدام Bun.

sh
bun run seed.ts
txt
Seeding complete.

يطبق Gel عددًا من أدوات توليد الكود لـ TypeScript. للاستعلام عن قاعدة البيانات التي قمنا بملؤها حديثًا بطريقة آمنة للنوع، سنستخدم @gel/generate لتوليد كود منشئ استعلامات EdgeQL.

sh
bunx @gel/generate edgeql-js
txt
Generating query builder...
Detected tsconfig.json, generating TypeScript files.
   To override this, use the --target flag.
   Run `npx @edgedb/generate --help` for full options.
Introspecting database schema...
Writing files to ./dbschema/edgeql-js
Generation complete! 🤘
Checking the generated query builder into version control
is not recommended. Would you like to update .gitignore to ignore
the query builder directory? The following line will be added:

   dbschema/edgeql-js

[y/n] (leave blank for "y")
> y

في index.ts، يمكننا استيراد منشئ الاستعلامات المولد من ./dbschema/edgeql-js وكتابة استعلام تحديد بسيط.

ts
import { createClient } from "gel";
import e from "./dbschema/edgeql-js";

const client = createClient();

const query = e.select(e.Movie, () => ({
  title: true,
  releaseYear: true,
}));

const results = await query.run(client);
console.log(results);

results; // { title: string, releaseYear: number | null }[]

بتشغيل الملف باستخدام Bun، يمكننا رؤية قائمة الأفلام التي أدخلناها.

sh
bun run index.ts
txt
[
  {
    title: "The Matrix",
    releaseYear: 1999
  }, {
    id: 2,
    title: "The Matrix Reloaded",
    releaseYear: 2003
  }, {
    id: 3,
    title: "The Matrix Revolutions",
    releaseYear: 2003
  }
]

للوثائق الكاملة، راجع وثائق Gel.

Bun بواسطة www.bunjs.com.cn تحرير