如何使用Sequelize CLI项目执行PostgreSQL函数
解决Sequelize中调用PostgreSQL函数时"query is not a function"的错误
你这是踩了Sequelize新手常犯的一个小坑——你调用的是Sequelize的类本身,而不是已经实例化、连接好数据库的对象!
问题根源
你之前的代码里:
const sequelize = require('sequelize'); sequelize.query('myfunction')
这里的sequelize是Sequelize的构造函数(也就是类),而query是属于实例化后的Sequelize对象的方法,直接调用类的话自然会报错"query is not a function"。
正确的解决步骤
因为你是用Sequelize CLI创建的项目,项目里已经帮你配置好了连接数据库的Sequelize实例,就在models/index.js文件里,你只需要正确导入它就行:
- 导入已配置好的Sequelize实例
// 从models目录导入自动生成的sequelize实例 const { sequelize } = require('./models');
- 调用PostgreSQL函数的正确写法
PostgreSQL里调用函数必须加上(),如果是无参数函数,直接执行SELECT myfunction();就行;如果有参数,建议用参数绑定来避免SQL注入:
无参数函数示例
sequelize.query('SELECT myfunction();') .then(([results, metadata]) => { // results就是函数返回的数据,metadata是执行元信息 console.log('函数执行结果:', results); }) .catch(err => { console.error('执行失败:', err); });
带参数函数示例
const userId = 123; sequelize.query('SELECT myfunction(:userId);', { // 用replacements传递参数,更安全 replacements: { userId }, // 指定查询类型,让结果更易处理 type: sequelize.QueryTypes.SELECT }) .then(results => { console.log('带参数的函数结果:', results); }) .catch(err => { console.error('执行出错:', err); });
额外提示
- 如果你的函数是执行数据修改(比如插入、更新),可以不用指定
type,或者用QueryTypes.RAW; - 确保
models/index.js里的数据库连接配置(主机、端口、用户名、密码、数据库名)都是正确的,否则实例无法连接数据库也会报错; - 如果你需要自己创建Sequelize实例(而不是用CLI生成的),可以这样写:
const Sequelize = require('sequelize'); const sequelize = new Sequelize('数据库名', '用户名', '密码', { host: 'localhost', dialect: 'postgres' }); // 之后就可以用sequelize.query()了
内容的提问来源于stack exchange,提问作者Diego Alves
相关产品推荐
相关产品推荐

