【发布时间】:2020-06-13 09:51:20
【问题描述】:
我在 Postgres 中创建了一个新表,但在使用 Sequelize 访问它时遇到问题。理论上我已经授予了表的所有权限,我可以使用同一个帐户通过我的 DB GUI 访问表。
这种关系是否需要一些额外的权限?
Executing (default): SELECT date_trunc('day', "created_at"), COUNT("id") AS "COUNT" FROM "notice_opened_tbl" AS "notice_opened_tbl" WHERE "notice_opened_tbl"."merchant_id" = 40 GROUP BY date_trunc('day', "created_at") ORDER BY date_trunc('day', "created_at") ASC;
(node:45) UnhandledPromiseRejectionWarning: SequelizeDatabaseError: permission denied for relation notice_opened_tbl
编辑:当前权限 - 如您所见,它们看起来是正确的。我现在尝试连接的用户是 postgresadmin(将在生产前更改)
编辑:我认为这与权限无关 - 我已经尝试了几乎所有与它们相关的东西,当我从本地计算机连接到数据库时,查询工作正常,但不是从 dev。不过,问题仅在于这张新创建的表。
另外,如果它对任何人有帮助,这在 AWS 上
这是我的开发设置 - 所有查询,但涉及新表的查询从这里开始:
const sequelize = new Sequelize(
process.env.DATABASE_NAME || "DATABASENAMEHERE",
process.env.DATABASE_USERNAME || "postgresadmin",
process.env.DATABASE_PASSWORD || "PASSWORDHERE",
{
host: process.env.DATABASE_HOST || "postgres",
dialect: "postgres",
port: process.env.DATABASE_PORT || 5432,
pool: {
max: 10,
min: 0,
acquire: 30000,
idle: 10000,
},
define: {
timestamps: false,
},
});
这是我的本地设置,可以在我的本地计算机上运行 - 查询从这里运行:
const sequelize = new Sequelize(
process.env.DATABASE_NAME || "DATABASEHERE",
process.env.DATABASE_USERNAME || "postgresadmin",
process.env.DATABASE_PASSWORD || "PASSWORDHERE",
{
host: process.env.DATABASE_HOST || "localhost",
dialect: "postgres",
port: process.env.DATABASE_PORT || 5465,
pool: {
max: 10,
min: 0,
acquire: 30000,
idle: 10000,
},
define: {
timestamps: false,
},
});
在 dev 中,主机是 postgres,因为这是与数据库连接关联的 Kubernetes 服务
这是查询的代码(尚未清理):
let merchantId = parseInt(req.param("merchantId"), 10);
let noticeWhere = {
merchant_id: merchantId,
};
if (req.query.startdate && req.query.enddate) {
// @ts-ignore
noticeWhere.created_at = {
[Op.between]: [req.query.startdate, req.query.enddate]
};
}
let noticesOpened = NoticeOpened.aggregate(
"id",
"COUNT", {
plain: false,
where: noticeWhere,
group: [sequelize.fn("date_trunc", "day", sequelize.col("created_at"))],
order: [
[sequelize.fn("date_trunc", "day", sequelize.col("created_at")), "ASC"]
],
});
return noticesOpened;
postgres Kubernetes 服务的 YAML 输出:
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"creationTimestamp":"2019-07-21T02:44:44Z","name":"postgres","namespace":"default","resourceVersion":"169556","selfLink":"/api/v1/namespaces/default/services/postgres","uid":"7ef0a60f-ab61-11e9-8d66-06505b5dee68"},"spec":{"externalName":"URLHERE","ports":[{"port":5432,"protocol":"TCP","targetPort":5432}],"sessionAffinity":"None","type":"ExternalName"},"status":{"loadBalancer":{}}}
creationTimestamp: 2019-11-23T00:07:00Z
name: postgres
namespace: default
resourceVersion: "14358655"
selfLink: /api/v1/namespaces/default/services/postgres
uid: 2c1a58a4-0d85-11ea-a8cb-02dead532c7a
spec:
externalName: URLHERE
ports:
- port: 5432
protocol: TCP
targetPort: 5432
sessionAffinity: None
type: ExternalName
status:
loadBalancer: {}
【问题讨论】:
-
您确定 sequelize 用户已授予对表的访问权限吗?可以执行
SELECT grantee, privilege_type FROM information_schema.role_table_grants WHERE table_name='mytable'查看。 -
已经检查过了。我将编辑答案以添加相关数据
-
@CecilRodriguez 您是否授予了 SCHEMA 的权限?
-
@Matt 这不是上面的 information_schema 吗?我将如何检查
-
@CecilRodriguez 您以什么用户身份登录?
标签: node.js postgresql kubernetes sequelize.js