本文将为您介绍如何使用云函数来操作数据库定时任务。
前提条件
已创建腾讯云数据库 PostgreSQL 实例。
操作步骤
创建并配置事件函数
说明:
函数名称、地域、命名空间、运行环境创建后不可修改,请确保正确填写。本文示例使用的运行环境为 Node.js 。
触发器是实现定时操作的核心。云函数提供每1分钟执行一次、每5分钟执行一次、每半小时执行一次、每1小时执行一次、每1天执行一次的预设选项,您也可选择自定义触发周期,使用 cron 表达式进行定时。具体请参见 cron 表达式使用方法。
创建完毕,在控制台单击函数 ID 进入函数管理 > 函数配置页面,单击编辑。

在网络配置中,开启私有网络,选择与需要操作的数据库实例相同的 VPC ,并指定子网。
注意:
云函数必须与数据库实例使用同一 VPC ,否则可能导致连接失败。

编辑云函数代码
方式一:在线编辑代码
进入函数管理 > 函数代码页面,选择提交方法为在线编辑。

安装依赖包
连接云数据库 PostgreSQL,需要先安装 pg 依赖包。在编辑器中单击查看 > 终端,打开终端。

在终端依次输入以下命令,安装依赖包。
cd srcnpm install pg
编辑代码
在 src 文件夹下的 index.js 中开始编辑函数。以下示例为在目标实例中插入一条数据( user_id ),执行方法名称为 index.main_handler 。
const { Client } = require('pg');exports.main_handler = async (event, context) => {// 从环境变量读取数据库连接信息const dbConfig = {host: process.env.DB_HOST,port: process.env.DB_PORT ? parseInt(process.env.DB_PORT) : 5432,database: process.env.DB_NAME,user: process.env.DB_USER,password: process.env.DB_PASSWORD,};// 简单校验if (!dbConfig.host || !dbConfig.database || !dbConfig.user || !dbConfig.password) {return {error: '数据库连接信息不完整,请检查环境变量配置',};}const client = new Client(dbConfig);try {await client.connect();// 生成数字字符串 user_id,比如当前时间戳字符串const userId = Date.now().toString();// 插入数据SQLconst sql = `INSERT INTO student_info_b0 (user_id) VALUES ($1);`;const res = await client.query(sql, [userId]);await client.end();return {message: '插入数据成功',insertedUserId: userId,rowCount: res.rowCount,};} catch (error) {if (client) {await client.end();}return {error: error.message,};}};
配置环境变量
进入函数管理 > 函数配置页面,单击编辑。
说明:
DB_HOST:目标实例的内网 IP 地址。
DB_NAME:目标数据库名称。
DB_USER:连接所用账户名。
DB_PASSWORD:连接所用账户的密码。
DB_PORT:连接使用的端口号。云数据库 PostgreSQL 默认使用5432 。

修改完毕,单击保存。
回到函数管理 > 函数代码页面,单击测试。测试成功,则定时函数创建成功。
方式二:上传代码文件
云函数支持通过本地上传 zip 包、本地上传文件夹、通过 cos 上传 zip 包。

上传完毕后,需确保安装依赖包,才能正常运行代码。
对于 Node.js ,系统可自动安装依赖,具体参见 在线依赖安装。
对于其他运行环境,请手动 安装依赖包 。
上传并安装依赖后,单击测试。测试成功,则定时函数创建成功。
管理定时配置
对于触发器,您可在触发管理页面中进行创建和删除。触发器不支持修改,您可删除原触发器后重新建立。
单击创建触发器,填写信息后提交。

对于不需要的触发器,单击右上角的删除即可。
测试数据库连接
若您的云函数执行失败,可使用以下方法测试是否成功连接到实例。

将以下内容粘贴到 src 文件夹下的 index.js 中。
const { Client } = require('pg');exports.main_handler = async (event, context) => {console.log('函数开始执行');const client = new Client({host: process.env.DB_HOST, // 数据库地址port: Number(process.env.DB_PORT), // 数据库端口user: process.env.DB_USER, // 数据库用户名password: process.env.DB_PASSWORD, // 数据库密码database: process.env.DB_NAME, // 数据库名称});try {console.log('开始连接数据库');await client.connect();console.log('数据库连接成功');console.log('开始执行查询');const res = await client.query('SELECT NOW()');console.log('查询结果:', res.rows[0]);await client.end();console.log('数据库连接关闭');console.log('函数执行完成,准备返回结果');return {statusCode: 200,body: JSON.stringify({message: '查询成功',time: res.rows[0],}),};} catch (err) {console.error('函数执行出错:', err);return {statusCode: 500,body: JSON.stringify({message: '函数执行失败',error: err.message,}),};}};
单击测试,在日志查询中查看运行日志返回的信息,根据日志信息定位问题,从而进一步解决。
