Ruby连接含Schema的PostgreSQL查询时报relation不存在错误咨询
解决PostgreSQL添加Schema后Ruby查询报错的问题
嘿,这个问题我太熟悉了!你遇到的ERROR: relation "brcmanager.Agency" does not exist错误,核心原因是PostgreSQL对带Schema的表名的引用规则理解错了——你写的"brcmanager.Agency"会被数据库当成一个完整的表名(也就是找一张叫brcmanager.Agency的表),而不是brcmanager这个Schema下的Agency表。
给你两个靠谱的解决方案:
方案1:正确引用Schema和表名
因为你的表名Agency首字母大写,PostgreSQL默认会把未加引号的标识符转成小写,所以必须用双引号分别包裹Schema和表名,写法如下:
修改后的代码:
require 'pg' @pg_conn = PGconn.connect("xxxxxxx.us-gov-west-1.rds.amazonaws.com", 5432, '', '', "BRCArchive", "yyyy", "zzzz") count = @pg_conn.exec('SELECT COUNT(*) FROM "brcmanager"."Agency"') puts count
这样数据库就能准确识别到brcmanager Schema下的Agency表了。
方案2:设置默认搜索Schema(更省心)
如果之后要多次查询这个Schema下的表,可以先设置默认的搜索路径,这样后续查询不用每次都写Schema名:
require 'pg' @pg_conn = PGconn.connect("xxxxxxx.us-gov-west-1.rds.amazonaws.com", 5432, '', '', "BRCArchive", "yyyy", "zzzz") # 把brcmanager设为优先搜索的Schema,public作为 fallback @pg_conn.exec('SET search_path TO brcmanager, public;') # 现在直接查询Agency表即可 count = @pg_conn.exec('SELECT COUNT(*) FROM "Agency"') puts count
额外提醒
如果你的Schema和表名都是全小写,其实可以不用加双引号(比如brcmanager.agency),但因为你的Agency有大写字母,必须用双引号包裹才能保持大小写敏感,不然PostgreSQL会去找小写的agency表,同样会报错。
内容的提问来源于stack exchange,提问作者Fatna
相关产品推荐
相关产品推荐

