Type-safe Query Builder Англійською: Drizzle ORM і Kysely
Вивчіть англійську лексику бібліотек баз даних з безпекою типів — Drizzle ORM і Kysely — включаючи міграцію схем, складання запитів і абстрагування діалектів.
Introduction
** Drizzle ORM ** і ** Kysely ** представляють нове покоління бібліотек баз даних, які переносять систему типів TypeScript безпосередньо у побудову запитів SQL. На відміну від традиційних ORM, які приховують SQL за магією, ці інструменти надають вам змогу писати запиту, що виглядає як SQL, але повністю перевіряє тип під час компіляції. Знання англійської мови, що використовується у цих інструментах — визначення схеми, виведення типів, складання запитів — є обов’ язковим для сучасної розробки сервера TypeScript і для чіткого спілкування з вашою командою.
Визначення схеми і міграції
** Визначення схеми ** — це код TypeScript, який описує структуру таблиць вашої бази даних — їхні стовпчики, типи, обмеження і зв’ язки. У Drizzle, ви пишете файл схеми, де кожна таблиця є викликом функції. *“Тримати всі ваші визначення схеми в одному schema.ts файлі, щоб міграції і запити мали одне і те ж джерело правди.” *
** Виведення типу ** — це процес, за допомогою якого TypeScript автоматично визначає тип значення на основі вашої схеми, без потреби явного запису цього типу. Це один з ключових пунктів продажу Drizzle. * “Зважаючи на виведення типу, коли ви вибираєте стовпець, який може бути нульовим, TypeScript автоматично позначає повернутий тип як нульовий — не потрібно вручну вводити анотацію типу.” *
** Міграція схеми ** — це скрипт, який перетворює структуру вашої бази даних з однієї версії на іншу — додаючи стовпчик, вилучаючи таблицю або змінюючи обмеження. * « Завжди переглядати сформовані звіти про міграцію схеми перед запуском їх у виробничій версії, навіть якщо ORM створив їх автоматично. » * Drizzle може створювати звіти про міграцію з ваших визначень схеми; звіти про міграцію Kysely написано вручну.
Будівництво та реконструкція
** Конструктор запитів ** це API, який створює SQL- запити за допомогою програмування, використовуючи виклики методів замість необроблених рядків. Як Drizzle, так і Kysely є конструкторами запитів. * “Конструктор запитів виявляє помилки в назві стовпчика під час компіляції, ще до того, як запит потрапить до бази даних.” *
** Складання запиту ** означає об’ єднання менших фрагментів запиту у більший запит. Наприклад, ви можете створити базовий запит, а потім умовно додати фільтри або об’ єднання. * « Ми використовуємо складання запитів для додавання сторінкування, фільтрування і впорядкування до базового запиту вибору без повторення основної логіки. » *
** Клаузула join ** з’ єднує дві таблиці за допомогою пов’ язаного стовпчика. Найбільш поширені типи INNER JOIN, LEFT JOIN, і RIGHT JOIN. “Додати клаузулу лівого з’єднання, щоб включити користувачів, навіть якщо вони не мають пов’язаних замовлень.” Drizzle і Kysely обидва роблять з’єднання безпечними для типів — TypeScript знає форму результату після з’єднання.
** підготовлений запит ** — це запит, який було зібрано один раз за допомогою бази даних, а потім виконано декілька разів з різними параметрами. Це покращує продуктивність і захищає від втручання SQL. “Для запитів, які виконуються тисячі разів на секунду, перетворюйте їх на підготовлені інструкції, щоб зменшити витрати на аналіз.”
Абстракція та абстракціонізм
** транзакція ** — це група операцій з базою даних, які або всі завершаться успішно, або всі завершаться невдало. Якщо якийсь крок зазнає невдачі, вся група повертається назад. *“Загорнути платіжну вставку і зменшення запасів у транзакцію, щоб ви ніколи не стягували з клієнта за запаси, які не можна резервувати.” *
** Абстракція діалектів ** означає написання запитів один раз і використання бібліотеки для обробки відмінностей між рушіями баз даних — PostgreSQL, MySQL, SQLite. Kysely особливо відомий за це. * “Дякуючи абстракції діалектів, ми можемо запускати ті ж самі запити проти PostgreSQL у виробництві і SQLite в тестах без зміни будь-якого коду запиту.” *
** Реляційне з’ єднання ** (або просто з’ єднання) виражає зв’ язок між двома таблицями у запиту. Коли ви почуєте * « приєднати таблицю користувачів до таблиці замовлень » *, це означає, що ви зв’ язуєте рядки з обох таблиць, у яких збігається спільний стовпчик (наприклад, user_id ). * « Без належного реляційного приєднання вам слід буде створити два окремі запиту на базу даних і об’ єднати результати у коді програми. » *
Ключовий словник
| Term | Definition |
|---|---|
| schema definition | TypeScript code describing the structure of database tables |
| type inference | TypeScript automatically determining a value’s type from context |
| schema migration | A script that changes the database structure from one version to another |
| query builder | An API that constructs SQL queries using method calls instead of raw strings |
| query composition | Building a complex query by combining reusable smaller query fragments |
| relational join | Combining rows from two tables based on a matching column |
| prepared statement | A pre-compiled query executed repeatedly with different parameters |
| dialect abstraction | A library layer that handles differences between database engines |
Практичні поради
-
** Використовуйте « type- safe » як складений прикметник. ** У англійській мові, ми ставимо це перед іменником: * « a type- safe query » *, * « type- safe joins » *. Без дефекту звучить неформально. Ця дрібниця має значення у письмовій документації і описах запитів на звантаження.
-
** Практикуйте пояснення міграцій. ** Зазвичай, у інтерв’ ю запитують: * « Як ви поводитесь зі змінами схеми бази даних? » *. Практикуйте відповіді за допомогою фраз: * “Ми генеруємо міграцію схеми, переглядаємо її і застосовуємо її під час розгортання.” *
-
** Розрізняйте « ORM » від « конструктора запитів ». ** ORM (Object- Relational Mapper) зазвичай відображає рядки бази даних на екземпляри класів з методами. Конструктор запитів побудовує SQL програмно, але залишається ближчим до SQL. Drizzle іноді називають ORM, але він поводиться більше як конструктор запитів — знання цієї різниці допоможе вам обговорити компроміси.
-
** Прочитайте вголос приклади з документації Kysely. ** У документації показано виклики конструктора запитів поряд зі створеним SQL. Читання обох версій створює розумовий зв’ язок між англійською технічною лексикою і реальними концепціями SQL.
Conclusion
Конструктори безпечних запитів ввели словник, який поєднує концепції TypeScript з термінологією SQL. Якщо ви зрозумієте такі терміни, як визначення схеми, виведення типів, складання запитів і абстрагування діалектів, ви зможете з впевненістю обговорювати питання проектування шарів бази даних і писати документацію, яку ваші колеги зрозуміють за один погляд. Ці інструменти стають стандартом в екосистемі TypeScript, і вільне володіння їх мовою є справжньою професійною перевагою.
Навигація зворотного зв’язку циклів — оновлення вашого підходу з точністю
Будьмо чесними; перегляд коду не завжди є сонячним і веселим. Часто, початковий відгук, який ви отримуєте на складну функцію, наприклад, інтеграцію Drizzle або Kysely, не стосується того, чи працює ваш підхід, а скоріше того, наскільки чітко ви його сформулювали. Зазвичай, такі коментарі звучать так: « Цей запит короткий, але для полегшення супроводження йому слід надати більш чітке позначення » або « Перенесення схеми виглядає добре, але додавання коментарів, у яких буде пояснено причину кожної зміни, значно полегшить читання і спростить майбутні оновлення ». Ці коментарі не є критикою ваших технічних навичок — вони стосуються комунікації і ясності.
Молодший розробник може відповісти у захисному ключі, наприклад, « Я вважаю, що це було достатньо ефективно ». Проте, більш лаконічна відповідь показує розуміння мети зворотнього зв’ язку. Хороша відповідь буде підтверджувати занепокоєння («Ви праві, щоб вказувати на потенціал майбутньої плутанини»), а потім проактивно розв’язувати її («Я перейменую параметр запиту на user_id для кращої ясності і додам коментарі, пояснюючи, чому ми обрали цей конкретний підхід»). Використання фраз типу « З точки зору підтримки … » або « Розглядаючи довгострокову масштабованість … » негайно вписує вашу відповідь у професійний контекст.
Інший сценарій може бути у каналі Slack, де обговорюється запит на витяг. Хтось зауважує: «Схоже, що ви безпосередньо взаємодіяли зі схемою бази даних тут - чи можемо ми дослідити використання конструктора запитів Kysely, щоб абстрагувати цей шар?» Відповідна відповідь вийшла б за рамки простої згоди або незгоди і продемонструвала б залучення. Ви можете відповісти: “Це справедливий аргумент. Я намагався отримати пряме керування в цьому конкретному випадку через [коротку, виправдану причину], але я безумовно можу дослідити використання підходу Kysely до конструктора запитів, якщо він збігається з загальною архітектурою - особливо якщо ми включимо безпеку типів всю дорогу.” Це демонструє відкритість до пропозицій і розуміння того, як різні підходи впливають на ширший проект.
Ось простий приклад використання програми Drizzle для вибору користувача за ІД, який показує, наскільки стислою може бути інформація, яку слід вказати під час перегляду:
-- Example query (illustrative)
import drizzle from 'drizzle';
import { postgres } from 'drizzle';
const sql = postgres(
`SELECT * FROM users WHERE id = ${userId}`
);
// ... (Drizzle ORM or Kysely would handle the execution and type safety here)
Врешті-решт, освоєння словника навколо цих інструментів не тільки про знання синтаксису; це про впевненість у формулюванні ваших рішень, розуміння зворотнього зв’язку конструктивно, і внесок у більш спільну і підтримувану базу коду.