2013-12-22 39 views
4

我有一個express應用程序,我將其連接到我的Postgres db。這裏是我的代碼:Postgres報告說一個關係不存在,但該表存在

var express = require('express'); 
var app = express(); 
var pg = require('pg').native; 
var connectionString = process.env.DATABASE_URL || 'postgres://localhost:5432/isx'; 
var port = process.env.PORT || 3000; 
var client; 


app.use(express.bodyParser()); 

client = new pg.Client(connectionString); 
client.connect(); 

app.get('/users', function(req, res) { 
    'use strict'; 
    console.log('/users'); 
    var query = client.query('SELECT * FROM users'); 
    query.on('row', function(row, result) { 
    result.addRow(row); 
    }); 
    query.on('end', function(result) { 
    console.log(result); 
    res.json(result); 
    }); 
}); 

我去我的地方Postgres,並期待在isx分貝,這裏是可用的表。

  List of relations 
Schema | Name | Type | Owner 
--------+----------+-------+---------- 
public | projects | table | postgres 
public | users | table | postgres 
(2 rows) 

但是當我嘗試打users表我得到這個錯誤Error: relation "users" does not exist

關係users存在。我已經檢查過,並且已連接到我認爲已連接到的Postgres的實例。我還能遺漏什麼?

+0

任何機率'process.env.DATABASE_URL'包含垃圾? –

+0

我在該語句之後放置了一個'console.log',它打印出邏輯運算符'postgres:// localhost:5432/isx'的右側。 'process.env.DATABASE_URL'僅用於部署到'Heroku'。 – jhamm

回答

2

檢查潛在的權限問題,例如不正確的搜索路徑或不正確的權限,或者該順序的某些內容。你可以運行此查詢顯示所有可用的表,例如:

select relname 
from pg_class c 
where pg_table_is_visible(c.oid) 
and relkind = 'r' 
and relname not like E'pg\_%'; 

它也可能是值得尋找到區分大小寫相關的問題。例如,pg庫可能會在小寫標識符周圍添加雙引號,並且您使用CamelCase或其他順序創建了表。

然後檢查search_path如果相關:

select usename, nspname || '.' || relname as relation, 
     case relkind when 'r' then 'TABLE' when 'v' then 'VIEW' end as relation_type, 
     priv 
from pg_class join pg_namespace on pg_namespace.oid = pg_class.relnamespace, 
    pg_user, 
    (values('SELECT', 1),('INSERT', 2),('UPDATE', 3),('DELETE', 4)) privs(priv, privorder) 
where relkind in ('r', 'v') 
     and has_table_privilege(pg_user.usesysid, pg_class.oid, priv) 
     and not (nspname ~ '^pg_' or nspname = 'information_schema') 
order by 2, 1, 3, privorder; 

來自:

show search_path; 

如果路徑是正確的,那麼使用檢查權限,例如Find out if user got permission to select/update/... a table/function/... in PostgreSQL

如果相關,使用alter schema和/或alter table修復權限:

+0

我在快速應用中運行了這個搜索:'SELECT table_name FROM information_schema.tables WHERE table_schema =「public」AND table_type =「BASE TABLE」'。我從查詢得到的響應是:'{ 「命令」: 「SELECT」, 「rowCount時」:1, 「OID」:空, 「行」:[ { 「表格名」: 「用戶」 } ], 「字段」:[{ 「名稱」: 「表格名」, 「dataTypeID」:1043} ], 「_parsers」:[ 空 ] }'。 – jhamm

+0

該查詢詢問數據庫哪些表在公共模式中。它與我提出的查詢不同,它向DB詢問你實際可以看到哪些表。如果您的搜索路徑(您可以通過運行「SHOW search_path;」查看)或您的權限不允許您查看錶格,它們將不會顯示在我建議的查詢中。 –

+0

我不明白公共模式片,但這是問題。這是我從查詢得到的結果:'{ 「命令」: 「選擇」, 「rowCount時」:0, 「OID」:空, 「行」:[], 「田」: { 「名稱」: 「relname」, 「dataTypeID」:19 } ], 「_parsers」:[ 空 ] }',所以該表是不可用的。 – jhamm

相關問題