Node.js调用时明明存在表格,为何提示"postgres: relation does not exist"?

3

我使用psql并创建了名为"users"的表;

 CREATE TABLE users (
    id integer NOT NULL,
    username text
);

我可以通过执行 SELECT * FROM users; 来获取行数据。

然而,当我使用 node.js 和 pg 模块库进行调用时,我会遇到臭名昭著的“关系不存在”错误。

const createQuery = {text: "INSERT INTO users(id, username) VALUES($1)",values: values}
const { rows } = await db.query(createQuery);

在服务器完全迁移之前,我没有遇到这个问题。


显然没有默认模式设置,对吧? - Renato
不确定您所说的默认模式是什么?我尝试使用 public.users 创建表格,但出现了相同的错误信息。我尝试了所有方法,例如 SELECT pg_catalog.set_config('search_path', '', true);SET search_path TO schema,public;,但仍然遇到了相同的问题。 - user299709
数据库名称是什么?你能分享一下代码执行的查询吗? - Saeed
创建一个变量 values: [ ['id1': 'username1'], ['id2', 'username2'], ... ]; 然后执行 db.query("INSERT INTO users(id, username) VALUES ?", [values], callback)。检查是否有效... - vrintle
3个回答

1
这种情况可能有两个可能的原因:
  1. 您可能在不同的模式中创建了此关系。PostgreSQL允许您将关系组织到称为模式的不同命名空间中。要指定一个模式,可以使用CREATE TABLE myschema.users (...),类似地,CREATE TABLE myschema.users。如果未指定模式名称,PostgreSql将使用默认模式,通常是public。要检查您的关系属于哪个模式,请运行此查询:SELECT table_schema, table_name FROM information_schema.tables WHERE table_name = 'users'
  2. 您可以使用SELECT current_database()SELECT inet_server_addr()查询来检查您连接到的数据库和主机,以防您连接到了错误的数据库/主机。

0

默认情况下,如果您没有指定任何模式,则Postgres会指向公共模式。请在表名后使用模式名称/数据库名称。确保您已在代码中提供了正确的数据库配置。如果配置正确,甚至您无需在查询中提供模式别名。


0

最有可能的选项是该表是在与您从node.js使用的默认模式不同的模式中创建的。

您可以通过查询表information_schema.tables来查找您的表所属的模式:

select table_schema from information_schema.tables where table_name = 'users';

有了这些信息,您现在可以在从node.js运行的查询中使用正确的模式名称限定您的表名。假设架构名称是myschema,则应执行以下操作:
INSERT INTO myschema.users(id, username) VALUES($1)

我正在使用PGAdmin 4,并按照您的建议在关系名称前面放置模式名称,但没有起作用。当我将模式名称和“.”放在一起,然后按[Ctrl + Space]键时,PGAdmin4列出了所有关系,我选择了想要的那个。由于某种原因,尽管我输入的关系名称是正确的,但它仍然有效。 - Jhonnatas Alencar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接