【发布时间】:2017-07-30 03:54:56
【问题描述】:
使用 Psycopg2,我需要测试一个 postgresql 表是否存在。
类似question,建议使用如下测试:
cursor.execute("select exists(select * from myDb.mytable_%s)" % complementName)
tableExists = cursor.fetchone()[0]
print(tableExists)
如果表已经存在,这很好用,并返回True,但如果表不存在,它就不起作用。我没有像我需要的那样返回False,而是收到一个错误
ProgrammingError:关系“myDb.mytable_001” 不存在
我做错了什么?如果表不存在,我应该怎么做才能获得False 语句?感谢您的帮助!
编辑
按照 cmets 中的建议,我也尝试过:
tableExists = cursor.execute("SELECT 1 AS result FROM pg_database WHERE datname='mytable_001'")
和
tableExists = cursor.execute("SELECT EXISTS (SELECT 1 AS result FROM pg_tables WHERE schemaname = 'mySchema' AND tablename = 'mytable_001)')")
但是无论表是否存在,两者都只是简单地返回None。但是,我不确定语法,也许你可以指出我可能犯的一些新手错误?谢谢!
编辑 2 最后,解决方案是结合上面的后一个查询,并按如下方式获取布尔结果:
cursor.execute("SELECT EXISTS (SELECT 1 AS result FROM pg_tables WHERE schemaname = 'mySchema' AND tablename = 'mytable_001');")
tableExists = cursor.fetchone()[0]
【问题讨论】:
-
另一种选择是检查
pg_database:postgresql.org/docs/9.4/static/catalog-pg-database.html。查询是SELECT 1 AS result FROM pg_database WHERE datname='FOO'。如果查询返回零行数据库不存在。 -
谢谢@BenH,我根据您的链接建议尝试了一个解决方案,但它仍然不起作用(参见上面的编辑)。有什么想法吗?
-
谢谢@Kirill,我尝试了你建议的最后一个查询,假设
datname应该引用表名,但它仍然不起作用...... -
tableExists = cursor.execute("SELECT EXISTS (SELECT 1 AS result FROM pg_tables WHERE tablename = 'mytable_001'))")
标签: python postgresql boolean psycopg2