# 模式

模式是一个查询接口,允许您对数据库模式执行任何操作。您通常会在迁移代码中看到这一点,然而,只要连接到数据库,受Laravel (opens new window)的启发, 您仍然可以在应用程序中的任何位置使用它。

让我们来看一下如下示例。

import { Schema } from "https://deno.land/x/cotton/mod.ts";

export async function up(schema: Schema) {
  await schema.createTable("users", (table) => {
    table.id();
    table.varchar("name");
  });
}

export async function down(schema: Schema) {
  await schema.dropTable("users");
}

这是一个关于 migration file 的示例。在这,我们尝试创建一个名字为 user 的表。 这个表包含两列,一个为主键自增长的键 id,另一个为 传统 varchar 类型的列 title

使用 Schema, 你可以做如下事情:

  • 创建表或者模式
  • 修改表或者列
  • 删除表或者列
  • 管理约束和索引

# 创建表

您可以使用 createTable 方法创建一个新表。 这有两个参数,第一个是表名,第二个是回调函数。 这个回调函数从参数中获取一个 TableBuilder,它包含一系列可帮助您向表中添加列的方法。

await schema.createTable("users", (table) => {
  table.id();
  table.varchar("email");
  table.integer("age");
  table.boolean("is_active");
  table.custom("fullname VARCHAR(255)");
  table.timestamps();
});

你可以在查看所有可用的列。

# 删除表

你可以通过调用 dropTable 并传入表名来轻松删除表。

await schema.dropTable("users");

为了同时删除多张表,请使用 dropTables 并以数组的形式传入表名。

await schema.dropTables(["users"]);

# 重命名表名

使用 renameTable 来重命名已存在的表。

await schema.renameTable("users", "accounts");

# 检查表是否已存在

使用 hasTable 来检查表是否在数据库中已存在。

if (await schema.hasTable("users")) {
  // `users` table exists
}

# 添加列

可以使用 addColumn 方法来为表添加列。

const nameColumn = new ColumnBuilder("name", "varchar", 255)
  .notNull()
  .default("John");
await schema.addColumn("users", nameColumn);

# 检查表是否有特定的列

为了检查表是否有特定的列, 你可以使用 hasColumn 并传入你期望的列名来检查。

if (await schema.hasTable("users", "name")) {
  // `users` table containts `name` column
}

# 列类型

如下是你用来构建你的表可以用到的所有列的类型。

语法 描述
id() bigIncrements('id') 的缩写。
increments('id') 自增长的列(在 PostgreSQL 中是 SERIAL)。
bigIncrements('id') 大自动增量列。
smallIncrements('id') 小自动增量列。
varchar('name', 100) 带有长度的 VARCHAR (text) (默认 255).
text('content') 大文本列 (在 MySQL 是 LONGTEXT).
boolean('is_active') 布尔兼容列。 MySQL&SQLite中的Tiny int以及PostgreSQL中的BOOLEAN。
integer('votes') 基本 INTEGER(number)列。
bigInteger('price') BIGINT等效列。
smallInteger('votes') SMALLINT 等效列。
datetime('created_at') 日期和时间列 (在 PostgreSQL 中是 TIMESTAMP).
date('created_at') 日期等效列。
timestamps() 创建两个名为“ created_at”和“ updated_at”的“ datetime”列。
custom('age INTEGER') 使用SQL查询自己添加列。
foreignId('user_id', 'users') 将外键添加到其他表的主键。