psycopg 2-Postgresql数据库中“关系不存在”

jjhzyzn0  于 2023-01-08  发布在  PostgreSQL
关注(0)|答案(3)|浏览(335)

我试图找出为什么我无法使用psycopg2访问PostgreSQL数据库中的特定表。我运行的是PostgreSQL 11.5
如果这样做,我就可以连接到相关数据库并读取其中的所有表:

import psycopg2

try:
connection = psycopg2.connect(user = "postgres",                #psycopg2.connect() creates connection to PostgreSQL database instance
                              password = "battlebot",
                              host = "127.0.0.1",
                              port = "5432",
                              database = "BRE_2019")

cursor = connection.cursor()                                #creates a cursor object which allows us to execute PostgreSQL commands through python source

#Print PostgreSQL version
cursor.execute("""SELECT table_name FROM information_schema.tables
   WHERE table_schema = 'public'""")

for table in cursor.fetchall():
    print(table)

结果如下所示:

('geography_columns',)
('geometry_columns',)
('spatial_ref_sys',)
('raster_columns',)
('raster_overviews',)
('nc_avery_parcels_poly',)
('Zone5e',)
('AllResidential2019',)
#....etc....

我感兴趣的表是最后一个,'AllResidential2019'
因此,我尝试通过执行以下操作连接到它并打印内容:

try:
    connection = psycopg2.connect(user = "postgres",                
    #psycopg2.connect() creates connection to PostgreSQL database instance
                              password = "battlebot",
                              host = "127.0.0.1",
                              port = "5432",
                              database = "BRE_2019")

    cursor = connection.cursor()                                #creates a cursor object which allows us to execute PostgreSQL commands through python source

    cursor.execute("SELECT * FROM AllResidential2019;")           #Executes a database operation or query. Execute method takes SQL query as a parameter. Returns list of result
    record = cursor.fetchall()

    print(record)

except (Exception, psycopg2.Error) as error:
    print("Error while connecting to PostgreSQL: ", error)

我得到了以下错误:

Error while connecting to PostgreSQL:  relation "allresidential2019" does not exist
LINE 1: SELECT * FROM AllResidential2019;

但是,当我尝试连接到另一个数据库中的另一个表时,我可以成功连接并获得结果(这很有效!结果是这个表中的数据):

try:
    connection = psycopg2.connect(user = "postgres",                #psycopg2.connect() creates connection to PostgreSQL database instance
                              password = "battlebot",
                              host = "127.0.0.1",
                              port = "5432",
                              database = "ClimbingWeatherApp") .  #different database name

    cursor = connection.cursor()                                

    cursor.execute("SELECT * FROM climbing_area_info ;")          
    record = cursor.fetchall()

    print(record)

except (Exception, psycopg2.Error) as error:
    print("Error while connecting to PostgreSQL: ", error)

我不明白为什么我可以使用完全相同的代码从一个表中检索信息,而不能从另一个表中检索信息(除了名称更改)。我也不知道如何解决这个问题。有人能提供建议吗?

iklwldmw

iklwldmw1#

表名区分大小写,必须用双引号括起来:

SELECT * FROM "AllResidential2019";

在Python程序中,它可能看起来像这样:

cursor.execute('SELECT * FROM "AllResidential2019"')

也可以使用专用模块SQL string composition:

from psycopg2 import sql

# ...

cursor.execute(sql.SQL("SELECT * FROM {}").format(sql.Identifier('AllResidential2019')))

注意区分大小写的Postgres标识符(例如表名、列名、视图名、函数名等)不必要地使简单的事情复杂化,我建议你不要使用它们。

20jt8wwn

20jt8wwn2#

问题的原因很可能是Postgres的引用规则,它遵循ANSI SQL关于双引号标识符的标准。在创建表时,您可能引用了表:

CREATE TABLE "AllResidential2019" (
   ...
)

由于至少有一个大写字母区分大小写,这要求您在引用该表时始终引用该表。请记住:单引号和双引号在SQL中有不同的含义,而在Python中几乎可以互换。

SELECT * FROM "AllResidential2019"
DELETE FROM "AllResidential2019" ...
ALTER TABLE "AllResidential2019" ...

如果表、列或其它标识符不包含特殊字符、空格或reserved words,则通常建议始终使用小写或不使用引号:

CREATE TABLE "allresidential2019" (
   ...
)

CREATE TABLE AllResidential2019 (
   ...
)

这样,* 任何 * 大写字母组合都可以使用

SELECT * FROM ALLRESIDENTIAL2019
SELECT * FROM aLlrEsIdEnTiAl2019
SELECT * FROM "allresidential2019"

参见关于这个主题的进一步阅读:

js5cn81o

js5cn81o3#

我在Ubuntu中也遇到过同样的错误,但在我的例子中,我不小心把表添加到了错误的数据库中,而这个数据库是由根postgres用户拥有的,而不是我为flask应用程序创建的新postgres用户。
我使用一个SQL文件来创建和填充这些表。这是我用来使用.sql文件创建这些表的命令。这允许您指定表的所有者以及应该在其中创建表的数据库:
sudo -u postgres psql -U my_user -d my_database -f file.sql -h localhost
然后系统将提示您输入my_users的密码。
sudo -u postgres仅在您以root用户身份从终端运行此命令时才需要,它基本上以postgres用户身份运行psql ...命令。

相关问题