在 Bun 环境下使用 Turso 和 Drizzle-ORM 确实是一个强大的组合。让我为你详细解释如何在命令行中使用 Turso,以及如何使用 Drizzle-ORM 在 Turso 中建立复杂的数据表。
- Turso 命令行使用详解
首先,你需要安装 Turso CLI。可以使用以下命令:
curl -sSfL https://get.tur.so/install.sh | bashTIP
这个 curl 命令用于下载并执行 Turso CLI 的安装脚本。让我为您解释一下命令中使用的参数:
-s: 静默模式。不显示进度条或错误信息。-S: 当与-s一起使用时,仍然显示错误信息(如果有的话)。-f: 失败时静默。如果服务器返回错误,curl 会静默失败而不是输出错误页面。-L: 跟随重定向。如果服务器返回重定向到另一个 URL,curl 会自动跟随。 . -https://get.tur.so/install.sh: 这是要下载的安装脚本的 URL。 命令的第二部分| bash表示将下载的脚本内容直接通过管道传递给 bash 执行。这个命令的作用是:
- 从指定的 URL 下载 Turso CLI 的安装脚本
- 静默执行下载,但在出现错误时仍会显示错误信息
- 如果遇到重定向会自动跟随
- 下载完成后,立即使用 bash 执行该脚本,开始安装 Turso CLI
安装完成后,以下是一些常用的 Turso 命令:
A) 登录 Turso:
turso auth loginB) 创建一个新的数据库:
turso db create my-databaseC) 列出所有数据库:
turso db listD) 连接到数据库:
turso db shell my-databaseE) 获取数据库 URL:
turso db show my-database --urlF) 获取数据库认证令牌:
turso db tokens create my-database- 使用 Drizzle-ORM 在 Turso 中建立复杂数据表
现在,让我们看看如何使用 Drizzle-ORM 在 Turso 中创建复杂的数据表。我们将创建一个博客系统的数据模型作为例子。
首先,安装必要的依赖:
bun add drizzle-orm @libsql/client
bun add -d drizzle-kit然后,创建一个 schema.ts 文件来定义数据模型:
import { sqliteTable, text, integer, unique } from 'drizzle-orm/sqlite-core';
// 用户表
export const users = sqliteTable('users', {
id: integer('id').primaryKey(),
username: text('username').notNull().unique(),
email: text('email').notNull().unique(),
passwordHash: text('password_hash').notNull(),
role: text('role', { enum: ['user', 'admin'] }).default('user').notNull(),
createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(sql`CURRENT_TIMESTAMP`),
});
// 文章表
export const posts = sqliteTable('posts', {
id: integer('id').primaryKey(),
title: text('title').notNull(),
content: text('content').notNull(),
authorId: integer('author_id').notNull().references(() => users.id),
published: integer('published', { mode: 'boolean' }).notNull().default(false),
createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(sql`CURRENT_TIMESTAMP`),
updatedAt: integer('updated_at', { mode: 'timestamp' }),
});
// 评论表
export const comments = sqliteTable('comments', {
id: integer('id').primaryKey(),
content: text('content').notNull(),
postId: integer('post_id').notNull().references(() => posts.id),
authorId: integer('author_id').notNull().references(() => users.id),
createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(sql`CURRENT_TIMESTAMP`),
});
// 标签表
export const tags = sqliteTable('tags', {
id: integer('id').primaryKey(),
name: text('name').notNull().unique(),
});
// 文章标签关联表
export const postTags = sqliteTable('post_tags', {
id: integer('id').primaryKey(),
postId: integer('post_id').notNull().references(() => posts.id),
tagId: integer('tag_id').notNull().references(() => tags.id),
}, (table) => ({
unq: unique().on(table.postId, table.tagId),
}));接下来,创建一个 migrate.ts 文件来执行迁移:
import { createClient } from '@libsql/client';
import { drizzle } from 'drizzle-orm/libsql';
import { migrate } from 'drizzle-orm/libsql/migrator';
import * as schema from './schema';
const client = createClient({
url: process.env.DATABASE_URL!,
authToken: process.env.DATABASE_AUTH_TOKEN,
});
const db = drizzle(client, { schema });
async function main() {
console.log('Running migrations...');
await migrate(db, { migrationsFolder: './drizzle' });
console.log('Migrations completed');
process.exit(0);
}
main().catch((err) => {
console.error('Migration failed');
console.error(err);
process.exit(1);
});现在,你需要生成迁移文件。创建一个 drizzle.config.ts 文件:
import type { Config } from 'drizzle-kit';
export default {
schema: './schema.ts',
out: './drizzle',
driver: 'turso',
dbCredentials: {
url: process.env.DATABASE_URL!,
authToken: process.env.DATABASE_AUTH_TOKEN,
},
} satisfies Config;然后运行以下命令生成迁移文件:
bun run drizzle-kit generate:sqlite最后,执行迁移:
bun run migrate.ts确保在运行这些命令之前,你已经设置了正确的环境变量 DATABASE_URL 和 DATABASE_AUTH_TOKEN。
这个例子展示了如何创建一个包含用户、文章、评论和标签的复杂博客系统数据模型。它包括了一对多关系(用户到文章、文章到评论)和多对多关系(文章到标签)。
使用 Drizzle-ORM 的优势在于它提供了类型安全和优秀的开发体验,同时 Turso 提供了高性能和全球分布式的数据存储解决方案。这个组合非常适合构建现代的、可扩展的 Web 应用程序。