EdgeOne Makers AI 与数据库集成
前面的教程讲了函数开发、部署、监控,这些是基础能力。但实际做项目的时候,你迟早会遇到两个问题: 数据往哪存? AI 模型怎么接? 函数是无状态的,请求结束资源就释放了,数据不会自动保存。AI 模型也不是函数自带的能力,需要单独对接。这篇讲怎么在 Makers 里集成数据库和 AI 服务,让你的应用能存数据、能用 AI。
数据库服务集成
Makers 的存储方案
EdgeOne Makers 本身提供了一些内置存储能力,但对于关系型数据的需求,通常需要对接外部数据库。
| 存储方案 | 类型 | 适合存什么 | 特点 |
|---|---|---|---|
| Edge KV | 键值存储 | 配置、缓存、简单数据 | 全球分布式,读取快 |
| Blob 存储 | 对象存储 | 文件、图片、视频 | 大容量,适合非结构化数据 |
| Supabase | 关系型数据库(PostgreSQL) | 用户、订单、业务数据 | 开源,自带认证和权限管理 |
| 其他数据库 | MySQL/PostgreSQL/MongoDB | 各类业务数据 | 需要自己搭建或购买云服务 |
集成 Supabase
Supabase 是最常用的选择,它提供 PostgreSQL 数据库、用户认证、文件存储等一整套服务,和 Makers 集成非常方便。
官方也提供了 SaaS 模板,直接整合了 Supabase 和 Stripe,开箱即用。
第一步: 创建 Supabase 项目
- 去 Supabase 注册账号
- 创建新项目,等一两分钟初始化完成
- 进入项目后,在 Settings -> API 页面获取三个关键信息:
- Project URL(项目地址)
- Anon Public Key(匿名公钥,前端用)
- Service Role Key(服务密钥,后端用,注意保密)
第二步: 配置环境变量
在 Makers 控制台的项目设置里,添加三个环境变量:
SUPABASE_URL = https://xxxxx.supabase.co
SUPABASE_ANON_KEY = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
SUPABASE_SERVICE_KEY = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
也可以在本地用 CLI 拉取和管理环境变量,参考CI/CD 集成那篇的环境变量管理部分。
第三步: 在函数中连接 Supabase
安装 Supabase 客户端:
npm install @supabase/supabase-js
在 Cloud Function 中使用:
// cloud-functions/api/users.js
// 查询用户列表的函数
import { createClient } from '@supabase/supabase-js';
// 从环境变量读取配置
const supabase = createClient(
process.env.SUPABASE_URL,
process.env.SUPABASE_SERVICE_KEY
);
export default async function onRequestGet(context) {
// 查询 users 表的所有记录
const { data, error } = await supabase
.from('users')
.select('*')
.order('created_at', { ascending: false });
if (error) {
return Response.json(
{ message: '查询失败', detail: error.message },
{ status: 500 }
);
}
return Response.json({ users: data });
}
第四步: 数据写入示例
// cloud-functions/api/users.js
// 创建新用户的函数
import { createClient } from '@supabase/supabase-js';
const supabase = createClient(
process.env.SUPABASE_URL,
process.env.SUPABASE_SERVICE_KEY
);
export default async function onRequestPost(context) {
// 解析请求体
const body = await context.request.json();
const { name, email } = body;
// 写入数据
const { data, error } = await supabase
.from('users')
.insert({ name, email })
.select() // select() 让 insert 返回插入的数据
.single();
if (error) {
return Response.json(
{ message: '创建失败', detail: error.message },
{ status: 500 }
);
}
return Response.json({ user: data }, { status: 201 });
}
集成其他数据库
如果你用 MySQL 或其他数据库,思路和 Supabase 类似: 安装对应的客户端库,在函数中用环境变量里的连接信息建立连接。
// cloud-functions/api/data.js
// 使用 MySQL 的示例
import mysql from 'mysql2/promise';
// 创建数据库连接池
const pool = mysql.createPool({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
waitForConnections: true,
connectionLimit: 5
});
export default async function onRequestGet(context) {
try {
// 执行查询
const [rows] = await pool.query('SELECT * FROM products LIMIT 10');
return Response.json({ products: rows });
} catch (err) {
return Response.json(
{ message: '查询失败', detail: err.message },
{ status: 500 }
);
}
}
需要注意的是,Cloud Functions 在中心机房运行,访问数据库的延迟比边缘节点低。如果数据库操作比较频繁,建议把逻辑放在 Cloud Functions 里而不是 Edge Functions。
数据持久化方案对比
不同场景适合不同的存储方案:
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 缓存和配置 | Edge KV | 全球分布式读取,速度最快 |
| 用户注册登录 | Supabase | 自带认证系统,省去自己开发 |
| 业务数据(订单、文章) | Supabase / MySQL | 关系型数据库,支持复杂查询 |
| 文件上传 | Blob 存储 / Supabase Storage | 大容量对象存储 |
| 会话数据 | Agent 内置会话存储 | Agent 应用自带会话记忆 |
| 简单计数和标记 | Edge KV | 读写快,适合轻量场景 |
AI 模型集成
AI 网关
EdgeOne Makers 提供了 AI 网关,统一管理各种大模型的调用。你不需要自己去各家申请 API Key、处理不同格式的接口,通过统一的网关地址就能调用多种模型。
| 优势 | 说明 |
|---|---|
| 统一接口 | 不同模型用同一个 API 格式调用 |
| 密钥托管 | 平台加密管理密钥,不用写在代码里 |
| 模型切换 | 改个环境变量就能切换模型 |
| 免费额度 | 新用户有限时免费 Token 额度 |
| 安全加速 | 经过 EdgeOne 边缘网络加速,延迟更低 |
使用内置模型
Makers 提供了一些免费模型额度,新用户注册后有 50 万 Token 的免费额度(按账号维度所有项目共享)。
使用方式很简单,通过统一的网关地址调用:
// cloud-functions/api/chat.js
// 调用 AI 模型的示例
import OpenAI from 'openai';
// 创建客户端,指向 Makers AI 网关
const client = new OpenAI({
apiKey: process.env.MAKERS_MODELS_KEY, // 平台自动注入的密钥
baseURL: 'https://ai-gateway.edgeone.link/v1' // 统一网关地址
});
export default async function onRequestPost(context) {
const body = await context.request.json();
const { message } = body;
try {
// 调用模型
const completion = await client.chat.completions.create({
model: '@makers/deepseek-v4-flash', // 使用内置模型
messages: [
{ role: 'system', content: '你是一个有帮助的助手。' },
{ role: 'user', content: message }
]
});
const reply = completion.choices[0].message.content;
return Response.json({ reply });
} catch (err) {
return Response.json(
{ message: '模型调用失败', detail: err.message },
{ status: 500 }
);
}
}
绑定自有模型密钥
如果你想用自己的 API Key(比如你有 OpenAI 或通义千问的密钥),可以在控制台的 Models -> API Key 页面绑定。平台会加密托管你的密钥,调用时通过环境变量引用。
// 使用自有密钥调用
const client = new OpenAI({
apiKey: process.env.MY_OPENAI_KEY, // 在控制台绑定的自有密钥
baseURL: 'https://ai-gateway.edgeone.link/v1'
});
模型切换
AI 网关的好处是切换模型只需要改模型名称,代码不用动:
// 切换不同的模型,只需要改 model 参数
const completion = await client.chat.completions.create({
model: '@makers/deepseek-v4-flash', // DeepSeek 模型
// model: '@makers/hunyuan-lite', // 混元模型
// model: 'gpt-4o-mini', // OpenAI 模型(需要自有密钥)
messages: [
{ role: 'user', content: message }
]
});
完整示例: 带数据库的 AI 聊天应用
下面把数据库和 AI 模型串起来,做一个能保存聊天记录的 AI 对话应用。
数据库表结构
在 Supabase 中创建聊天表:
-- 创建聊天记录表
CREATE TABLE chat_messages (
id BIGSERIAL PRIMARY KEY,
session_id TEXT NOT NULL, -- 会话 ID
role TEXT NOT NULL, -- user 或 assistant
content TEXT NOT NULL, -- 消息内容
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 按 session_id 查询的索引
CREATE INDEX idx_chat_session ON chat_messages(session_id, created_at);
发送消息并保存
// cloud-functions/api/chat.js
// AI 聊天接口,同时保存聊天记录到数据库
import { createClient } from '@supabase/supabase-js';
import OpenAI from 'openai';
const supabase = createClient(
process.env.SUPABASE_URL,
process.env.SUPABASE_SERVICE_KEY
);
const client = new OpenAI({
apiKey: process.env.MAKERS_MODELS_KEY,
baseURL: 'https://ai-gateway.edgeone.link/v1'
});
export default async function onRequestPost(context) {
const body = await context.request.json();
const { sessionId, message } = body;
// 第一步: 保存用户消息
await supabase.from('chat_messages').insert({
session_id: sessionId,
role: 'user',
content: message
});
// 第二步: 获取历史消息作为上下文
const { data: history } = await supabase
.from('chat_messages')
.select('role, content')
.eq('session_id', sessionId)
.order('created_at', { ascending: true })
.limit(20); // 最近 20 条消息作为上下文
// 第三步: 调用 AI 模型
const completion = await client.chat.completions.create({
model: '@makers/deepseek-v4-flash',
messages: history
});
const reply = completion.choices[0].message.content;
// 第四步: 保存 AI 回复
await supabase.from('chat_messages').insert({
session_id: sessionId,
role: 'assistant',
content: reply
});
return Response.json({ reply });
}
查询聊天记录
// cloud-functions/api/history.js
// 查询某个会话的聊天记录
import { createClient } from '@supabase/supabase-js';
const supabase = createClient(
process.env.SUPABASE_URL,
process.env.SUPABASE_SERVICE_KEY
);
export default async function onRequestGet(context) {
const url = new URL(context.request.url);
const sessionId = url.searchParams.get('sessionId');
if (!sessionId) {
return Response.json(
{ message: '缺少 sessionId 参数' },
{ status: 400 }
);
}
const { data, error } = await supabase
.from('chat_messages')
.select('*')
.eq('session_id', sessionId)
.order('created_at', { ascending: true });
if (error) {
return Response.json(
{ message: '查询失败', detail: error.message },
{ status: 500 }
);
}
return Response.json({ messages: data });
}
这个例子展示了数据库和 AI 模型配合使用的典型模式: 用户输入 -> 保存记录 -> 查历史上下文 -> 调用模型 -> 保存回复。实际项目中可以根据需求扩展,比如加用户认证、多会话管理、消息搜索等。
速查卡片
| 要点 | 说明 |
|---|---|
| 内置存储 | Edge KV(键值)、Blob(文件),适合轻量场景 |
| 外部数据库 | Supabase 最常用,自带认证和权限管理 |
| 集成步骤 | 创建数据库项目 -> 获取密钥 -> 配置环境变量 -> 函数中调用 |
| AI 网关 | 统一接口调用多种模型,密钥由平台加密管理 |
| 内置模型 | 新用户有免费 Token 额度,通过网关地址直接调用 |
| 模型切换 | 改 model 参数就行,代码不用动 |
| 推荐搭配 | Edge KV 做缓存、Supabase 做业务数据、AI 网关做模型调用 |
| 函数选择 | 数据库操作放 Cloud Functions,延迟更低 |