Drizzle

Drizzle ORM 是一個擁有強大功能的無頭 TypeScript ORM 🐲

使用 Drizzle,您可以在 TypeScript 中定義和管理資料庫結構描述、以類似 SQL 或關聯的方式存取資料,並利用選用的工具將您的開發體驗提升到新的境界 🤯

同時也適用於無伺服器環境

Drizzle 可在 Qwik 中與 routeLoader$routeAction$server$ 函數搭配使用。這些是 Qwik API,允許程式碼僅在伺服器端執行。

將 Drizzle 新增至 Qwik 最簡單的方法是使用 npm qwik add drizzle 命令。這將安裝所需的依賴項,並使用 drizzle 結構描述建立 db 資料夾。

npm run qwik add drizzle

Drizzle 是一個擁抱 SQL 的 ORM。與其他 ORM 不同,它不會偏離 SQL,消除了 SQL 和框架 API 的雙重學習曲線。如果您了解 SQL,就可以輕鬆地充分利用 Drizzle。

列出所有使用者

我們將使用 routeLoader$ 來查詢資料庫中的所有使用者,使用 db.query.users.findMany(),並返回結果。

src/routes/users/index.tsx
import { component$ } from "@builder.io/qwik";
import { routeLoader$ } from "@builder.io/qwik-city";
import { drizzle } from "drizzle-orm/better-sqlite3";
import Database from "better-sqlite3";
import { schema } from "../../../drizzle/schema";
 
export const useGetUsers = routeLoader$(async () => {
  const sqlite = new Database("./drizzle/db/db.sqlite");
  const db = drizzle(sqlite, { schema });
  const users = await db.query.users.findMany();
  return users;
});
 
export default component$(() => {
  const users = useGetUsers();
  return (
    <section>
      <h1>User's directory</h1>
      <ul>
        {users.value.map((user) => (
          <li key={user.id}>
            <a href={`/users/${user.id}`}>
              {user.name} ({user.email})
            </a>
          </li>
        ))}
      </ul>
    </section>
  );
});
 

顯示使用者詳細資訊

我們將使用 routeLoader$ 根據 userId URL 參數查詢特定使用者,使用 db.query.users.findFirst({ where: (users, { eq }) => eq(users.id, userId), }),並返回結果。

src/routes/users/[userId]/index.tsx
import { component$ } from "@builder.io/qwik";
import { routeLoader$ } from "@builder.io/qwik-city";
import { drizzle } from "drizzle-orm/better-sqlite3";
import Database from "better-sqlite3";
import { schema } from "../../../../drizzle/schema";
 
export const useGetUser = routeLoader$(async (requestEvent) => {
  const userId = parseInt(requestEvent.params["userId"], 10);
  const sqlite = new Database("./drizzle/db/db.sqlite");
  const db = drizzle(sqlite, { schema });
  const user = await db.query.users.findFirst({
    where: (users, { eq }) => eq(users.id, userId),
  });
  if (!user) {
    // Set the status to 404 if the user is not found
    requestEvent.status(404);
  }
  return user;
});
 
export default component$(() => {
  const user = useGetUser();
  return (
    <section>
      <h1>User detail</h1>
      {user.value ? (
        <>
          <p>Name: {user.value.name}</p>
          <p>Email: {user.value.email}</p>
        </>
      ) : (
        <p>User not found</p>
      )}
    </section>
  );
});
 

新增使用者

我們將使用 routeAction$Form 建立一個漸進式表單,將新使用者新增至資料庫。我們將使用 db.insert(schema.users).values(data) 建立使用者。

src/routes/create/index.tsx
import { component$ } from "@builder.io/qwik";
import { routeAction$, zod$, z, Form } from "@builder.io/qwik-city";
import { drizzle } from "drizzle-orm/better-sqlite3";
import Database from "better-sqlite3";
import { schema } from "../../../drizzle/schema";
export const useCreateUser = routeAction$(
  async (data) => {
    const sqlite = new Database("./drizzle/db/db.sqlite");
    const db = drizzle(sqlite, { schema });
    const user = await db.insert(schema.users).values(data);
    return user;
  },
  zod$({
    name: z.string(),
    email: z.string().email(),
  }),
);
 
export default component$(() => {
  const createUserAction = useCreateUser();
  return (
    <section>
      <h1>Create User</h1>
      <Form action={createUserAction}>
        <label>
          Name
          <input name="name" value={createUserAction.formData?.get("name")} />
        </label>
        <label>
          Email
          <input name="email" value={createUserAction.formData?.get("email")} />
        </label>
        <button type="submit">Create</button>
      </Form>
      {createUserAction.value && (
        <div>
          <h2>User created successfully!</h2>
        </div>
      )}
    </section>
  );
});
 

貢獻者

感謝所有協助改進此文件的貢獻者!

  • LazyClicks