name: bknd-add-field description: 当向现有Bknd实体添加字段时使用。覆盖所有字段类型(文本、数字、布尔、日期、枚举、json、jsonschema、媒体)、字段修饰符(.required()、.unique()、.default())、验证选项和UI与代码方法。
添加字段到实体
在Bknd中向现有实体添加新字段(列)。
先决条件
- 现有的Bknd实体(参见
bknd-create-entity) - 对于代码模式:访问您的模式文件
何时使用UI vs 代码
使用UI模式时
- 快速迭代/原型设计
- 非开发者添加字段
- 在编码前测试字段配置
使用代码模式时
- 需要版本控制
- 可重现的模式更改
- 需要类型安全
- 团队协作
UI方法
步骤 1: 访问实体
- 启动服务器:
npx bknd run - 打开
http://localhost:1337 - 导航到 数据 部分
- 点击目标实体(例如
posts)
步骤 2: 添加字段
- 点击 + 添加字段
- 从下拉菜单中选择字段类型:
- 文本:字符串、电子邮件、URL
- 数字:整数、小数
- 布尔:真/假
- 日期:时间戳
- 枚举:固定值集
- JSON:非结构化数据
- 输入字段名称(蛇形命名:
first_name、created_at)
步骤 3: 配置选项
根据字段类型配置:
所有类型:
- 必需:如果字段不能为空,则切换开启
- 默认值:设置默认值
文本:
- 最小/最大长度
- 模式(正则表达式验证)
数字:
- 最小值/最大值
- 倍数(针对整数)
枚举:
- 添加枚举值(每行一个)
步骤 4: 保存和同步
- 点击 保存字段
- 点击 同步数据库 以应用更改
代码方法
步骤 1: 定位实体定义
在模式中找到您的实体:
const schema = em({
posts: entity("posts", {
title: text().required(),
// 在此处添加新字段
}),
});
步骤 2: 添加字段
将新字段添加到实体的字段对象中:
const schema = em({
posts: entity("posts", {
title: text().required(),
subtitle: text(), // 新增:可选文本字段
view_count: number(), // 新增:可选数字字段
}),
});
步骤 3: 重启服务器
Bknd在启动时自动同步模式。重启服务器以应用更改。
字段类型参考
文本字段
import { text } from "bknd";
entity("users", {
// 基本可选文本
bio: text(),
// 必需文本
email: text().required(),
// 唯一约束
username: text().unique(),
// 带验证
slug: text({
minLength: 3,
maxLength: 100,
pattern: "^[a-z0-9-]+$",
}).required(),
// 带默认值
status: text({ default_value: "active" }),
})
数字字段
import { number } from "bknd";
entity("products", {
// 基本数字
quantity: number(),
// 带验证的必需字段
price: number({
minimum: 0,
maximum: 99999.99,
}).required(),
// 仅整数(multipleOf: 1)
rating: number({
minimum: 1,
maximum: 5,
multipleOf: 1,
}),
})
布尔字段
import { boolean } from "bknd";
entity("posts", {
// 默认为假
published: boolean(),
// 默认真
active: boolean({ default_value: true }),
})
日期字段
import { date } from "bknd";
entity("events", {
// 基本日期
start_date: date().required(),
// 自动设置为当前时间
created_at: date({ default_value: "now" }),
})
枚举字段
注意: 导入为 enumm(双’m’)以避免JS保留字。
import { enumm } from "bknd";
entity("posts", {
// 数组语法
status: enumm({
enum: ["draft", "published", "archived"],
default_value: "draft",
}).required(),
// 对象语法(键值对)
priority: enumm({
enum: {
LOW: "low",
MEDIUM: "medium",
HIGH: "high",
},
default_value: "MEDIUM",
}),
})
JSON字段
import { json } from "bknd";
entity("users", {
// 无类型JSON
metadata: json(),
// 类型化JSON(仅TypeScript,无运行时验证)
preferences: json<{
theme: "light" | "dark";
notifications: boolean;
}>(),
// 带默认值
tags: json<string[]>({ default_value: [] }),
})
JSON Schema字段
用于运行时验证的JSON:
import { jsonschema } from "bknd";
entity("webhooks", {
payload: jsonschema({
type: "object",
properties: {
event: { type: "string" },
timestamp: { type: "number" },
},
required: ["event", "timestamp"],
}),
})
媒体字段
用于文件附件:
import { media } from "bknd";
entity("posts", {
// 单个文件
cover_image: media({ entity: "posts" }),
// 带约束的多个文件
gallery: media({
entity: "posts",
min_items: 1,
max_items: 10,
mime_types: ["image/jpeg", "image/png", "image/webp"],
}),
})
字段修饰符
在字段类型后链接修饰符:
| 修饰符 | 描述 | 示例 |
|---|---|---|
.required() |
不能为空 | text().required() |
.unique() |
唯一约束 | text().unique() |
.default(value) |
默认值 | text().default("pending") |
.references(target) |
外键 | number().references("users.id") |
链接示例:
entity("users", {
email: text().required().unique(),
role: text().default("user"),
org_id: number().references("organizations.id"),
})
字段命名约定
| 约定 | 示例 | 注意 |
|---|---|---|
| 蛇形命名 | first_name |
非 firstName |
| 小写 | created_at |
非 CreatedAt |
| 描述性 | published_at |
非 pub |
常见问题
字段已存在
错误: 字段 "title" 在实体 "posts" 上已存在
修复: 每个字段名称在实体中必须唯一。选择其他名称。
无效字段名称
错误: 无效字段名称
修复: 使用小写字母、数字和下划线。必须以字母开头。
// 有效
title: text()
first_name: text()
item_2: text()
// 无效
Title: text() // 无大写
2_item: text() // 不能以数字开头
first-name: text() // 无连字符
枚举导入错误
错误: enum 是保留字
修复: 导入并使用 enumm(双’m’):
// 错误
import { enum } from "bknd";
// 正确
import { enumm } from "bknd";
status: enumm({ enum: ["a", "b"] })
现有数据上缺少必需修饰符
问题: 在已有空值的字段上添加 .required()。
修复: 要么:
- 首先更新现有记录为非空值
- 添加默认值:
text({ default_value: "N/A" }).required() - 保持字段可选
字段更改未反映
问题: 在代码中添加字段但未出现。
修复:
- 重启服务器(模式在启动时同步)
- 验证字段在正确的实体定义中
- 检查模式中的语法错误
验证
UI模式
- 点击数据部分中的实体
- 验证新字段出现在字段列表中
- 使用新字段创建测试记录
代码模式
const api = app.getApi();
// 使用新字段创建记录
const result = await api.data.createOne("posts", {
title: "测试",
subtitle: "新字段测试", // 您的新字段
});
console.log(result);
CLI检查
npx bknd debug paths
# 在输出中检查实体字段
DOs和DON’Ts
DO:
- 使用蛇形命名作为字段名称
- 从可选字段开始;如果需要再设为必需
- 对现有数据的必需字段添加默认值
- 使用适当的字段类型(不要将数字存储为文本)
DON’T:
- 使用
enum导入(使用enumm) - 在没有默认值的情况下对现有实体添加
.required() - 使用驼峰命名或帕斯卡命名作为字段名称
- 创建冗余字段(例如
id是自动生成的)
相关技能
- bknd-create-entity - 首先创建新实体
- bknd-define-relationship - 添加实体间关系
- bknd-modify-schema - 重命名或更改字段类型
- bknd-crud-create - 使用新字段插入数据