在 Bun 环境下使用 Turso 和 Drizzle-ORM 确实是一个强大的组合。让我为你详细解释如何在命令行中使用 Turso,以及如何使用 Drizzle-ORM 在 Turso 中建立复杂的数据表。

  1. Turso 命令行使用详解

首先,你需要安装 Turso CLI。可以使用以下命令:

curl -sSfL https://get.tur.so/install.sh | bash

TIP

这个 curl 命令用于下载并执行 Turso CLI 的安装脚本。让我为您解释一下命令中使用的参数:

  • -s: 静默模式。不显示进度条或错误信息。
  • -S: 当与 -s 一起使用时,仍然显示错误信息(如果有的话)。
  • -f: 失败时静默。如果服务器返回错误,curl 会静默失败而不是输出错误页面。
  • -L: 跟随重定向。如果服务器返回重定向到另一个 URL,curl 会自动跟随。 . - https://get.tur.so/install.sh: 这是要下载的安装脚本的 URL。 命令的第二部分 | bash 表示将下载的脚本内容直接通过管道传递给 bash 执行。这个命令的作用是:
  1. 从指定的 URL 下载 Turso CLI 的安装脚本
  2. 静默执行下载,但在出现错误时仍会显示错误信息
  3. 如果遇到重定向会自动跟随
  4. 下载完成后,立即使用 bash 执行该脚本,开始安装 Turso CLI

安装完成后,以下是一些常用的 Turso 命令:

A) 登录 Turso:

turso auth login

B) 创建一个新的数据库:

turso db create my-database

C) 列出所有数据库:

turso db list

D) 连接到数据库:

turso db shell my-database

E) 获取数据库 URL:

turso db show my-database --url

F) 获取数据库认证令牌:

turso db tokens create my-database
  1. 使用 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_URLDATABASE_AUTH_TOKEN

这个例子展示了如何创建一个包含用户、文章、评论和标签的复杂博客系统数据模型。它包括了一对多关系(用户到文章、文章到评论)和多对多关系(文章到标签)。

使用 Drizzle-ORM 的优势在于它提供了类型安全和优秀的开发体验,同时 Turso 提供了高性能和全球分布式的数据存储解决方案。这个组合非常适合构建现代的、可扩展的 Web 应用程序。