为什么 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 4.23
- postgres:我连接到 10.13 (Ubuntu 10.13-1-pgdg18.04+1),虽然 12
也安装了。
- psycopg2: 2.8.5
尝试刷新 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)}")
我在我的 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 4.23
- postgres:我连接到 10.13 (Ubuntu 10.13-1-pgdg18.04+1),虽然 12 也安装了。
- psycopg2: 2.8.5
尝试刷新 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)}")