为什么 PGadmin 浏览器 Psycopg2 看不到 postgres 视图?

Why would postgres views not be visible to PGadmin browser, Psycopg2?

我在我的 postgres 数据库中创建了一些视图。我知道它们在那里,因为我可以通过 PGAdmin4 中的查询工具查询它们(并且它们在重新启动托管数据库的机器之间持续存在),但它们在模式浏览器中既不可见,也无法通过 psycopg2 查询。

对于更大的上下文,我试图从存储在数据库中的大量文档中提取一些文本。 (数据库是从第三方接收的数据的副本,并完全归一化等)我想在Python中做我的NLP废话,同时通过[=41=定义很多文档分类] 的观点,因此分类是一致的、持久的,并且可以广泛分享给我的团队。

谷歌搜索没有发现任何相关信息,所以我想知道是否有我遗漏的基本配置问题。 (与 postgres 相比,我对 SQLServer 的经验要丰富得多。)

示例:

[假设我连接到数据库 DB,模式 SC,它有表 T1、T2、T3。]

-- in PGAdmin4 window
CREATE VIEW v_my_view as
SELECT T1.field1, T2.field2
  FROM T1
  JOIN T2
        on T1.field3 = T2.field3

重新启动主机(肯定是新的 PGAdmin 会话),以下工作:

-- in pgadmin4 window
SELECT *
  FROM v_my_view

-- 123456 results returned

...但即使这有效,在 pgadmin4 浏览器面板中,'views' 文件夹是空的(就在自豪地显示 T1 和 T2 的表格文件夹下方)。

在 psycopg2 中:

import psycopg2
import pandas as pd

sqluser = 'me'
sqlpwd = 'secret'
dbname = 'DB'
schema_name = 'SC'
pghost = 'localhost'

def q(query):
    cnxn = psycopg2.connect(dbname=dbname, user=sqluser, password=sqlpwd, host=pghost)
    cursor = cnxn.cursor()
    cursor.execute('SET search_path to ' + schema_name)
    return pd.read_sql_query(query, cnxn)

view_query = """select  *
  from  v_my_view
 limit  100;"""

table_query = """select *
  from  SC.T1
 limit  100;"""

# This works
print(f"Result: {q(table_query)}")
# This does not; error is: relation 'v_my_view' does not exist
# (Same result if view is prefixed with schema name)
# print(f"Result: {q(view_query)}")

软件版本:

尝试刷新 PGAdmin 工具栏上的对象。这应该刷新视图。 谢谢 阿马尔

事实证明这是一个菜鸟错误。视图是针对搜索路径的第一个模式创建的(可以通过执行 show search_path; 来检查,在我的例子中,尽管试图将其设置为适当的模式名称,但它被设置为 "$user", public)。因此,视图是根据与我正在使用的模式不同的模式创建的 with/where 表已定义。

一旦我在正确的模式下查看,创建的视图就会在左侧浏览器中全部可见。

对psycopg2代码进行如下修改returns预期结果:

import psycopg2
import pandas as pd

sqluser = 'me'
sqlpwd = 'secret'
dbname = 'DB'
schema_name = 'SC'
pghost = 'localhost'

def q(query):
    cnxn = psycopg2.connect(dbname=dbname, user=sqluser, password=sqlpwd, host=pghost)
    cursor = cnxn.cursor()
    cursor.execute('SET search_path to ' + schema_name)
    return pd.read_sql_query(query, cnxn)

# NOTE I am explicitly indicating the 'public' schema here
view_query = """select  *
  from  public.v_my_view
 limit  100;"""

table_query = """select *
  from  SC.T1
 limit  100;"""

# This works
print(f"Result: {q(table_query)}")
# This works too once I specify the right schema:
print(f"Result: {q(view_query)}")