【问题标题】:postgres SELECT query returns unusable resultpostgres SELECT 查询返回不可用的结果
【发布时间】:2020-04-15 06:14:01
【问题描述】:

我有一个返回不可用结果的简单 SELECT 查询。我在 node.js 中使用 pg-promise

[
  {
    "function_name": "(f10d1988-4db5-49de-97ab-0c8b15bedfa7,image.jpg,Image)"
  },
  {
    "function_name": "(f10d1988-4db5-49de-97ab-0c8b15bedfa7,image2.jpg,Image 2)"
  }
]

但我期待一个基本的 json 结构,例如

[
  {
    id: '',
    title: '',
    image: ''
  },
  {...etc}
]

为什么要这样做?如何获得标准化结果?

我的查询如下所示:

CREATE OR REPLACE FUNCTION get_photos(
  title_param     TEXT
)
RETURNS TABLE(
  id         UUID,
  image      varchar(200),
  title      varchar(200) 
) AS
$func$
BEGIN
  RETURN QUERY SELECT
    i.id,
    i.image,
    i.title
  FROM images AS i
  WHERE i.title = title_param;
END;
$func$ LANGUAGE PLPGSQL;

这是我的数据库连接器设置,几乎所有默认设置。

require('dotenv').config();
const Promise = require('bluebird');
const pg = require('pg-promise')({
  promiseLib: Promise
});

const config = {
  user: process.env.USER,
  host: process.env.HOST,
  database: process.env.DATABASE,
  password: process.env.PASSWORD
};

const db = pg(config);

export default db;

这里是调用函​​数的 express 端点:

export const getData = async (req, res) => {
  const { title } = req.query;
  let data;
  try {
    data = await db.many('SELECT function_name($1)', [title]);
  } catch (err) {
    data = err;
  }
  res.send(data);
};

编辑

我手动而不是通过函数运行查询,并且正确返回了数据,这意味着我的 TABLE() 返回存在问题。什么可能导致此问题?

images = await db.many(`
  SELECT
    p.id,
    p.img,
    p.type,
    p.title
  FROM photos p
  WHERE p.type = '${type}';
`, [type]);

【问题讨论】:

标签: node.js json postgresql select pg-promise


【解决方案1】:

因为函数定义为返回一个表,所以需要像表一样使用:

SELECT * FROM function_name($1)

【讨论】:

    【解决方案2】:

    使用func作为查询方法:

    data = await db.func('function_name', [title]);
    

    它假定您返回一个表,因此默认情况下会为您工作。

    对于存储过程,还有proc 方法。


    另外,您的图像查询参数格式错误,请参阅Named Parameters

    重要提示:切勿在 ES6 模板字符串中使用保留的 ${} 语法 ...

    【讨论】:

    • 我尝试了上述方法但收到以下错误error: function function_name($1)(unknown) does not exist 但将函数保持为db.many(SELECT * FROM function_name(...etc)) 也可以正常工作,有趣的是 ${} 不应该使用但在这个简单的情况下仍然有效很高兴看到最佳实践作为参考
    • @Brandon 看起来您没有正确传递预期的参数,或者没有定义function_name 函数。您应该在此处包含您实际执行的代码。顺便提一句。我是pg-promise的作者,我给出的解决方法是正确的。
    • 我又试了一次,问题是我在使用db.func 时保持function_name($1) 而不仅仅是function_name。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-02-03
    • 2013-06-30
    • 2020-07-09
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    相关资源
    最近更新 更多