psycopg2,选择和模式
我正在尝试对一个属于“dam_vector”这个架构的表进行简单的选择查询。结果我遇到了一个错误:
psycopg2.ProgrammingError: 关系 "dam_vector.parcels_full" 不存在 第1行: SELECT * FROM "dam_vector.parcels_full"
我搞不明白这个问题,感觉我漏掉了什么明显的东西。如果你能提供一些帮助,那就太好了。
这是我使用的代码。db是一个连接字符串,它成功连接到了数据库。
cur = db.cursor()
query = 'SELECT * FROM "dam_vector.parcels_full"'
cur.execute(query)
results = cur.fetchall()
当这个方法失败后,我在谷歌上查了一些资料,尝试了另外一种方法,但还是遇到了同样的错误。
cur.execute("SET search_path TO dam_vector,public")
db.commit()
cur = db.cursor()
query = 'SELECT * FROM "parcels_full"'
cur.execute(query)
results = cur.fetchall()
2 个回答
1
你不需要在 dam_vector.parcels_full
周围加上引号。
下面的输出是否显示了确实存在一个 parcels_full
表?
cur.execute("""SELECT tablename
FROM pg_tables
WHERE tablename NOT LIKE ALL (ARRAY['pg_%','sql_%']);""")
cur.fetchall()
5
双引号会把里面的内容当作标识符,所以查询
SELECT * FROM "dam_vector.parcels_full";
会从模式 public
(或者搜索路径中的任何内容)中找到表 dam_vector.parcels_full
(这里的点被当作表名的一部分)。
正如亚当所说,对于没有特殊字符的名称,你不需要使用引号。可以试试:
SELECT * FROM dam_vector.parcels_full;
如果你真的想使用双引号,可以这样做:
SELECT * FROM "dam_vector"."parcels_full";