我试图找出为什么我无法使用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)
我不明白为什么我可以使用完全相同的代码从一个表中检索信息,而不能从另一个表中检索信息(除了名称更改)。我也不知道如何解决这个问题。有人能提供建议吗?
3条答案
按热度按时间iklwldmw1#
表名区分大小写,必须用双引号括起来:
在Python程序中,它可能看起来像这样:
也可以使用专用模块SQL string composition:
注意区分大小写的Postgres标识符(例如表名、列名、视图名、函数名等)不必要地使简单的事情复杂化,我建议你不要使用它们。
20jt8wwn2#
问题的原因很可能是Postgres的引用规则,它遵循ANSI SQL关于双引号标识符的标准。在创建表时,您可能引用了表:
由于至少有一个大写字母区分大小写,这要求您在引用该表时始终引用该表。请记住:单引号和双引号在SQL中有不同的含义,而在Python中几乎可以互换。
如果表、列或其它标识符不包含特殊字符、空格或reserved words,则通常建议始终使用小写或不使用引号:
这样,* 任何 * 大写字母组合都可以使用
参见关于这个主题的进一步阅读:
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 ...
命令。