Astro DB: Database สำหรับ Astro Projects

#astro12 เม.ย. 2569

Astro DB คืออะไร

Astro DB เป็น fully-managed SQL database ที่ออกแบบมาสำหรับ Astro projects โดยเฉพาะ ใช้ LibSQL (SQLite) เป็น engine

ติดตั้ง

npx astro add db

กำหนด Schema

// db/config.ts
import { defineDb, defineTable, column } from 'astro:db';

const Post = defineTable({
  columns: {
    id: column.number({ primaryKey: true }),
    title: column.text(),
    content: column.text(),
    publishedAt: column.date(),
    authorId: column.number({ references: () => User.columns.id })
  }
});

const User = defineTable({
  columns: {
    id: column.number({ primaryKey: true }),
    name: column.text(),
    email: column.text({ unique: true })
  }
});

export default defineDb({
  tables: { Post, User }
});

Seed Data

// db/seed.ts
import { db, Post, User } from 'astro:db';

export default async function() {
  await db.insert(User).values([
    { id: 1, name: 'สมชาย', email: 'somchai@example.com' }
  ]);

  await db.insert(Post).values([
    {
      id: 1,
      title: 'บทความแรก',
      content: 'เนื้อหา...',
      publishedAt: new Date(),
      authorId: 1
    }
  ]);
}

Query

---
import { db, Post, User, eq } from 'astro:db';

// SELECT ทั้งหมด
const posts = await db.select().from(Post);

// WHERE
const post = await db.select()
  .from(Post)
  .where(eq(Post.id, 1))
  .get();

// JOIN
const postsWithAuthor = await db.select()
  .from(Post)
  .innerJoin(User, eq(Post.authorId, User.id));
---

{posts.map(post => <h2>{post.title}</h2>)}

Insert, Update, Delete

// Insert
await db.insert(Post).values({ title: 'ใหม่', content: '...' });

// Update
await db.update(Post)
  .set({ title: 'แก้ไขแล้ว' })
  .where(eq(Post.id, 1));

// Delete
await db.delete(Post).where(eq(Post.id, 1));

Local Development

npm run dev  # ใช้ local SQLite

สรุป

Astro DB ทำให้เพิ่ม database เข้า Astro project ได้ง่ายมาก มี type safety เต็มรูปแบบ เหมาะกับ small-medium projects ครับ