You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postman向Courses数据库插课程数据遇语法错误求助

问题解决指南

一、先解决type "value1" does not exist的核心错误

你当前的SQL语句存在两个致命语法问题:

  1. value1 'value2' 格式错误:value1未加单引号,且与value2之间缺失逗号,导致SQL将value1识别为数据类型,触发报错。
  2. 未指定插入字段列表:直接写INSERT INTO courses VALUES (...)不仅容易因字段顺序错误导致数据混乱,还必须填写所有159个字段值,完全没必要。

二、简化159个字段的插入写法

1. 只指定需要手动赋值的字段

数据库表中很多字段会有默认值(如创建时间、状态字段)或自动生成(如自增主键),你只需要在SQL中列出需要手动传入值的字段即可,跳过其余字段:

-- 示例:只列必填/需自定义的字段,其余靠数据库默认值填充
const addCourse = "INSERT INTO courses (id_curso, nome_curso, duracao, categoria, descricao) VALUES ($1, $2, $3, $4, $5)";

注:$1、$2是PostgreSQL的参数占位符,若用MySQL则换成?。

2. 用参数化查询替代硬编码值

绝对不要把具体值直接写在SQL字符串里,用占位符配合请求参数,既避免SQL注入,又不用手动拼接大量引号。


三、修复控制器代码的逻辑错误

你的控制器里有两处关键错误:

  1. pool.query(queries.addCourse), (...) 的逗号位置错误,回调函数必须作为pool.query的第三个参数传入。
  2. 未将req.body中的实际数据传递给SQL查询。

修改后的完整控制器代码:

const addCourse = (req, res) => {
    console.log(req.body);
    const { id_curso } = req.body;

    // 检查课程是否存在
    pool.query(queries.checkIdCursoExists, [id_curso], (error, results) => {
        if (error) {
            console.error(error);
            return res.status(500).send("Erro ao verificar curso");
        }
        if (results.rows.length) {
            return res.send("Este curso ja existe.");
        }

        // 按SQL字段顺序提取req.body中的参数
        const courseData = [
            id_curso,
            req.body.nome_curso,
            req.body.duracao,
            req.body.categoria,
            req.body.descricao
            // 如需添加更多字段,按SQL顺序追加即可
        ];

        // 执行插入操作,注意回调函数的位置
        pool.query(queries.addCourse, courseData, (error, results) => {
            if (error) {
                console.error(error);
                return res.status(500).send("Erro ao criar curso");
            }
            res.status(201).send("Curso criado com sucesso");
        });
    });
};

四、高效处理大量字段的技巧

如果需要插入的字段确实很多,且req.body的键名与数据库字段名完全一致,可以用以下方法简化:

  1. 在SQL中按顺序列出所有需要赋值的字段:
const addCourse = "INSERT INTO courses (id_curso, nome_curso, duracao, categoria, descricao, ...) VALUES ($1, $2, $3, $4, $5, ...)";
  1. 在代码中按SQL字段顺序生成参数数组:
// 与SQL字段顺序完全对应的键名列表
const fieldList = ['id_curso', 'nome_curso', 'duracao', 'categoria', 'descricao', ...];
// 自动提取req.body中的对应值
const courseData = fieldList.map(field => req.body[field]);

// 执行查询
pool.query(queries.addCourse, courseData, (error, results) => {
    // 错误处理与响应逻辑
});

额外注意事项

  • 确保Postman请求的Body选择raw->JSON格式,传入与字段匹配的JSON数据。
  • 数字类型字段(如duracao)无需加引号,参数化查询会自动匹配数据库类型。
  • 不要忽略错误处理:避免直接throw error,改用console.error记录并返回友好的错误响应。

内容的提问来源于stack exchange,提问作者Claudia Pacheco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:45:28