更好的数据库
没有认证域的数据库公用设备——一个聚焦的Fetter Auth数据库层.
更好的DB给了你更好的Auth的被证明的适配器模式和CLI驱动的策略生成,完全专注于数据库管理.
特征
- 🎯 重点 ——数据库公用设施不具有认证复杂性
- 🔄 上流同步 – 保持与更好的 Auth 更新保持一致
- 🔧 作战测试 ——以"更好的奥思"被证明的建筑为主
- 🚀 多种操作程序 - 普里斯玛、德利兹尔、克赛利、蒙戈德比等
- 🔌 广泛 ——自定义表格插件系统
- ⚡ CLI驱动 ——以单一命令生成计划
快速启动
# Install core and your preferred adapter
npm install @btst/db @btst/adapter-prisma
npm install -D @btst/cli
定义您的方案 :
// db.ts
import { defineDb } from "@btst/db";
export const db = defineDb({
post: {
modelName: "post",
fields: {
title: {
type: "string",
required: true,
},
content: {
type: "string",
required: true,
},
published: {
type: "boolean",
defaultValue: false,
},
authorId: {
type: "string",
required: true,
},
createdAt: {
type: "date",
defaultValue: () => new Date(),
},
},
},
author: {
modelName: "author",
fields: {
name: {
type: "string",
required: true,
},
email: {
type: "string",
required: true,
unique: true,
},
},
},
});
export default db;
生成和运行迁移 :
# Generate Prisma schema
npx btst generate --config=db.ts --orm=prisma --output=schema.prisma
# Or for Kysely (requires database connection)
DATABASE_URL=sqlite:./dev.db npx btst generate --config=db.ts --orm=kysely --output=migrations/schema.sql
# Or: npx btst generate --config=db.ts --orm=kysely --output=migrations/schema.sql --database-url=sqlite:./dev.db
# Run migrations
npx prisma migrate dev
在您的应用程序中使用 :
import { prismaAdapter } from "@btst/adapter-prisma";
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
const adapter = prismaAdapter(prisma)({});
// Create
await adapter.create({
model: "post",
data: { title: "Hello", content: "World", authorId: "1" },
});
// Query
const posts = await adapter.findMany({
model: "post",
where: [{ field: "published", value: true }],
});
CLI 命令
初始化
npx btst init [--output=db.ts]
生成
# Prisma
npx btst generate --config=db.ts --orm=prisma --output=schema.prisma
# Drizzle
npx btst generate --config=db.ts --orm=drizzle --output=src/db/schema.ts
# Kysely (requires database connection for introspection)
# Using DATABASE_URL environment variable
DATABASE_URL=sqlite:./dev.db npx btst generate --config=db.ts --orm=kysely --output=migrations/schema.sql
# Or using --database-url flag
npx btst generate --config=db.ts --orm=kysely --output=migrations/schema.sql --database-url=sqlite:./dev.db
npx btst generate --config=db.ts --orm=kysely --output=migrations/schema.sql --database-url=postgres://user:pass@localhost:5432/db
# By default, auth tables (User, Session, Account, Verification) are filtered out
# To include them, add --include-better-auth flag
npx btst generate --config=db.ts --orm=prisma --output=schema.prisma --include-better-auth
迁移
# Kysely only - for Prisma/Drizzle use their native tools
# Using DATABASE_URL environment variable or --database-url param
DATABASE_URL=sqlite:./dev.db npx btst migrate --config=db.ts
# Or using --database-url flag
npx btst migrate --config=db.ts --database-url=sqlite:./dev.db
npx btst migrate --config=db.ts --database-url=postgres://user:pass@localhost:5432/db
# Generate SQL to file instead of running migrations
npx btst migrate --config=db.ts --output=migrations.sql --database-url=sqlite:./dev.db
# By default, auth tables (User, Session, Account, Verification) are filtered out
# To include them, add --include-better-auth flag
npx btst migrate --config=db.ts --output=migrations.sql --include-better-auth --database-url=sqlite:./dev.db
字段类型
defineDb({
example: {
modelName: "example",
fields: {
// Basic types
textField: { type: "string" },
numberField: { type: "number" },
booleanField: { type: "boolean" },
dateField: { type: "date" },
jsonField: { type: "json" },
// Required/Optional
required: { type: "string", required: true },
optional: { type: "string", required: false },
// Unique
uniqueField: { type: "string", unique: true },
// Defaults
active: { type: "boolean", defaultValue: false },
createdAt: { type: "date", defaultValue: () => new Date() },
// References
userId: {
type: "string",
references: {
model: "user",
field: "id",
onDelete: "cascade",
},
},
},
},
})
适应器 API
所有适配器都提供这些方法:
// Create
adapter.create({ model: "post", data: {...} })
// Read
adapter.findOne({ model: "post", where: [...] })
adapter.findMany({ model: "post", where: [...], limit: 10 })
adapter.count({ model: "post", where: [...] })
// Update
adapter.update({ model: "post", where: [...], update: {...} })
adapter.updateMany({ model: "post", where: [...], update: {...} })
// Delete
adapter.delete({ model: "post", where: [...] })
adapter.deleteMany({ model: "post", where: [...] })
见 更好的 Auth 适配器指南 详细情况.
插件
以可重复使用的插件扩展您的计划 :
import { defineDb } from "@btst/db";
import { todoPlugin } from "@btst/plugins";
export const db = defineDb({
post: {
modelName: "post",
fields: {
title: { type: "string", required: true },
},
},
}).use(todoPlugin);
创建自定义插件 :
import { createDbPlugin } from "@btst/db";
export const tagsPlugin = createDbPlugin("tags", {
tag: {
modelName: "tag",
fields: {
name: {
type: "string",
required: true,
unique: true,
},
},
},
});
可用的适配器
npm install @btst/adapter-prisma # Prisma
npm install @btst/adapter-drizzle # Drizzle
npm install @btst/adapter-kysely # Kysely
npm install @btst/adapter-memory # Memory (testing)
npm install @btst/adapter-mongodb # MongoDB
与更好的Auth的关系
更好的DB是一个薄薄的包裹 围绕Better Auth的数据库层:
我们所保存的:
- 所有适配器执行
- QQ CLI 生成行为
- 实地类型系统
- ++ 插件架构
我们排除的:
- * 认证表格(用户、会话、账户)
- ++ OAuth 配置
- 认证中间软件
版本 : @btst/*@1.4.x 音轨 [email protected]
从Better Auth 迁移
替换导入 :
// Before
import { prismaAdapter } from "better-auth/adapters/prisma";
// After
import { prismaAdapter } from "@btst/adapter-prisma";
将配置替换为方案 :
// Before
export const auth = betterAuth({
database: prismaClient,
plugins: [...]
});
// After
export const db = defineDb({
// your tables using Better Auth schema format
post: {
modelName: "post",
fields: {
title: { type: "string", required: true },
},
},
});
更新 CLI :
# Before
npx @better-auth/cli generate
# After
npx btst generate
实例
博客平台
import { defineDb } from "@btst/db";
export const db = defineDb({
post: {
modelName: "post",
fields: {
title: {
type: "string",
required: true,
},
slug: {
type: "string",
required: true,
unique: true,
},
content: {
type: "string",
required: true,
},
published: {
type: "boolean",
defaultValue: false,
},
authorId: {
type: "string",
required: true,
references: {
model: "author",
field: "id",
onDelete: "cascade",
},
},
createdAt: {
type: "date",
defaultValue: () => new Date(),
},
},
},
author: {
modelName: "author",
fields: {
name: {
type: "string",
required: true,
},
email: {
type: "string",
required: true,
unique: true,
},
bio: {
type: "string",
required: false,
},
},
},
category: {
modelName: "category",
fields: {
name: {
type: "string",
required: true,
},
slug: {
type: "string",
required: true,
unique: true,
},
},
},
});
电子商务
export const db = defineDb({
product: {
modelName: "product",
fields: {
name: {
type: "string",
required: true,
},
slug: {
type: "string",
required: true,
unique: true,
},
price: {
type: "number",
required: true,
},
inventory: {
type: "number",
defaultValue: 0,
},
categoryId: {
type: "string",
required: false,
references: {
model: "category",
field: "id",
onDelete: "set null",
},
},
},
},
order: {
modelName: "order",
fields: {
orderNumber: {
type: "string",
required: true,
unique: true,
},
customerId: {
type: "string",
required: true,
references: {
model: "customer",
field: "id",
onDelete: "cascade",
},
},
status: {
type: "string",
required: true,
defaultValue: "pending",
},
total: {
type: "number",
required: true,
},
createdAt: {
type: "date",
defaultValue: () => new Date(),
},
},
},
orderItem: {
modelName: "order_item",
fields: {
orderId: {
type: "string",
required: true,
references: {
model: "order",
field: "id",
onDelete: "cascade",
},
},
productId: {
type: "string",
required: true,
references: {
model: "product",
field: "id",
onDelete: "cascade",
},
},
quantity: {
type: "number",
required: true,
},
price: {
type: "number",
required: true,
},
},
},
});
资源
许可证
麻省理工学院