Gel (المعروفة سابقًا بـ EdgeDB) هي قاعدة بيانات علائقية بيانية تعمل بواسطة Postgres في الخلفية. توفر لغة مخطط تصريحية ونظام ترحيل ولغة استعلام كائنية التوجيه، بالإضافة إلى دعم استعلامات SQL الخام. تحل مشكلة التوافق العلائقي الكائني على مستوى قاعدة البيانات، مما يلغي الحاجة إلى مكتبة ORM في كود التطبيق.
أولاً، قم بتثبيت Gel إذا لم تكن قد قمت بذلك بالفعل.
curl https://www.geldata.com/sh --proto "=https" -sSf1 | shirm https://www.geldata.com/ps1 | iexbrew install geldata/tap/gel-cliاستخدم bun init لإنشاء مشروع جديد.
mkdir my-gel-app
cd my-gel-app
bun init -yسنستخدم سطر أوامر Gel لتهيئة مثيل Gel لمشروعنا. ينشئ هذا ملف gel.toml في جذر مشروعنا.
gel project initNo `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 ونشغل استعلامًا بسيطًا.
gel
gel> select 1 + 1;2ثم قم بتشغيل \quit للخروج من REPL.
gel> \quitمع تهيئة المشروع، يمكننا تحديد مخطط. أمر gel project init أنشأ بالفعل ملف dbschema/default.esdl ليحتوي على المخطط الخاص بنا.
dbschema
├── default.esdl
└── migrationsافتح هذا الملف والصق المحتويات التالية.
module default {
type Movie {
required title: str;
releaseYear: int64;
}
};ثم قم بإنشاء وتطبيق ترحيل أولي.
gel migration createCreated /Users/colinmcd94/Documents/bun/fun/examples/my-gel-app/dbschema/migrations/00001.edgeql, id: m1uwekrn4ni4qs7ul7hfar4xemm5kkxlpswolcoyqj3xdhweomwjrqgel migrateApplied m1uwekrn4ni4qs7ul7hfar4xemm5kkxlpswolcoyqj3xdhweomwjrq (00001.edgeql)مع تطبيق المخطط الخاص بنا، دعنا ننفذ بعض الاستعلامات باستخدام مكتبة عميل Gel لـ JavaScript. سنقوم بتثبيت مكتبة العميل و CLI لتوليد الكود الخاص بـ Gel، وإنشاء ملف seed.ts.
bun add gel
bun add -D @gel/generate
touch seed.tsالصق الكود التالي في seed.ts.
العميل يتصل تلقائيًا بقاعدة البيانات. نقوم بإدراج بعض الأفلام باستخدام طريقة .execute(). سنستخدم تعبير for الخاص بـ EdgeQL لتحويل هذا الإدراج الجماعي إلى استعلام محسن واحد.
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.
bun run seed.tsSeeding complete.يطبق Gel عددًا من أدوات توليد الكود لـ TypeScript. للاستعلام عن قاعدة البيانات التي قمنا بملؤها حديثًا بطريقة آمنة للنوع، سنستخدم @gel/generate لتوليد كود منشئ استعلامات EdgeQL.
bunx @gel/generate edgeql-jsGenerating 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 وكتابة استعلام تحديد بسيط.
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، يمكننا رؤية قائمة الأفلام التي أدخلناها.
bun run index.ts[
{
title: "The Matrix",
releaseYear: 1999
}, {
id: 2,
title: "The Matrix Reloaded",
releaseYear: 2003
}, {
id: 3,
title: "The Matrix Revolutions",
releaseYear: 2003
}
]للوثائق الكاملة، راجع وثائق Gel.