错误:关系不存在

12

我的node应用程序发生了一个[错误:关系“causes”不存在]的错误。该关系确实存在,我不确定问题出在哪里。

我使用以下命令创建了表格:

CREATE TABLE causes (

cause_id bigint NOT NULL default nextval('causes_cause_id_seq'::regclass),
cause_name varchar(40) NOT NULL,
goal integer,
sponsor varchar(30),
organization varchar(30),
submitter varchar(30),
address varchar(34),
balance numeric

);

这是导致错误的查询语句:
client = pg.connect(connectionString, function(err, client, done){
    if(err) console.log(err);

    client.query('INSERT INTO causes (cause_name, goal, organization, sponsor, submitter) VALUES ($1,$2,$3,$4,$5) RETURNING *', r, function(err, result){
    if(err) console.log(err);
    });
});

你能分享一些代码片段吗? - Bulkan
3
我猜你执行了一个 create table "NameOfRelation",但现在想要执行类似于 select * from NameOfRelation 的语句。 - mu is too short
3
如果您需要帮助,您应该展示真实、未经编辑、准确的错误信息和SQL查询语句; PostgreSQL版本也是有用的。 - Craig Ringer
@KinnardHockenhull 编辑后更新的答案。 - Craig Ringer
7个回答

4

我不确定你们是否面临和我一样的情况。

请确保您使用正确的用户名/密码连接至正确的数据库主机。

我发现我错误地连接到了一个错误的数据库 :(


1
听起来很蠢,但在我的情况下是正确的。LOL。我在数据库URL中使用了一个环境变量,并忘记在启动服务器之前源化该文件。 - Nhat Dinh

3
在你的 client.query('INSERT...') 调用之前,运行以下命令以确保你的关系在当前连接上是可访问的:
client.query('SELECT * FROM pg_catalog.pg_tables', function(err, result) {
  console.log(result);
});

如果在结果中没有看到您的causes关系,则可能该关系不存在,或者是由不同的用户创建的。

我看不到它。只有两个用户,我都尝试过了。 - Kinnard Hockenhull
@KinnardHockenhull,看起来你连接到了错误的主机/错误的数据库。 - Craig Ringer
一切拼写正确。我正在使用 AWS,这会有所不同吗? - Kinnard Hockenhull

1

我遇到了同样的问题。我正在查询新创建的表格 Example。这是我的代码:

const { Pool, Client } = require('pg');
const dbClient = new Client({
  user: 'postgres',
  host: 'localhost',
  database: 'postgres',
  password: 'test',
  port: 5432,
});
dbClient.connect();
dbClient.query('SELECT * from Example', (err, res) => {
    console.log(err, res);
    dbClient.end();
});

我仔细检查了连接参数和任何可能的拼写错误。结果发现,在pg中,您需要用引号将表名括起来:
dbClient.query('SELECT * from "Example"', (err, res) => {
    console.log(err, res);
    dbClient.end();
});

3
只有当它包含大写字母时,我才会这样认为。 - Catfish
当表格采用驼峰命名格式时,需要用双引号括起来(但模式名称除外)。例如)client.query('select * from scmcore."CustomersStatistics" limit 10')。 - jetulis

1
这可能是大小写折叠问题,参见此答案PostgreSQL SQL语法文档
编辑后:看起来不是大小写折叠问题。检查search_path(SHOW search_pathSELECT current_setting('search_path')),并将其与表所在的架构(\dt+ tablename)进行比较,以确保该表位于客户端路径上。
还要确保连接到同一个数据库。

它们都说公共的。我在使用node-postgres的连接字符串是'pg://myusername:mypassword@localhost/tzedakahbits';,我需要指定一些东西才能连接到数据库吗? - Kinnard Hockenhull
@KinnardHockenhull 嗯,当您使用 psql 时,您是否也连接到 localhost 和数据库名称 tzedakahbits?尝试在 localhost 后明确指定端口,确保它与 psql 使用的端口相同(在 psql 中运行 SHOW port 以查看您连接到的 DB 的端口)。有时人们会运行多个 PostgreSQL 的副本并感到困惑。 - Craig Ringer
我已经指定了端口,但它仍然显示关系不存在。 - Kinnard Hockenhull
1
@KinnardHockenhull 如果您尝试从 psql 中查询它呢?SELECT * FROM therelationname - Craig Ringer
1
好的,我想我弄清楚了,我有两个数据库,一个存在表格,另一个不存在。 - Kinnard Hockenhull

1
如果您正在使用Postgres URL进行连接,请在其中明确指定数据库。有时,如果您没有这样做,您使用的库将默认将您的用户名作为数据库,这可能是错误的。我刚刚遇到了这种情况。请参见PostgreSQL Connection URL

0

我解决了我的问题,只需要在表名之前设置模式名称:

SELECT * FROM public.mytable

替代

SELECT * FROM mytable

-1

当我尝试使用用户输入创建表名并插入数据库时,遇到了类似的错误。

我找到的解决方案是将创建表和插入操作分别作为两个函数,连续调用这两个函数,但第二个函数需要延迟执行。

以下是指导代码:

function createTable(){
// your create table query here
}

function pushData(){
// your insert into table query here
}

createTable()
setTimeout(postTable, 3000); // for 3 seconds, can make is less, I used 3 secs to be safe

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