测试 PostgreSQL 表是不是不存在(使用 psycopg2)

Posted

技术标签:

【中文标题】测试 PostgreSQL 表是不是不存在(使用 psycopg2)【英文标题】:Test if PostgreSQL table does NOT exist (with psycopg2)测试 PostgreSQL 表是否不存在(使用 psycopg2) 【发布时间】: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]

【问题讨论】:

检查系统表:***.com/questions/20582500/… 另一种选择是检查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'))") 【参考方案1】:

您的查询似乎不正确。您应该提供要验证它是否存在的表名......还有更多方法可以验证表是否存在,为什么要让它如此复杂......

SELECT table_name FROM information_schema.tables where table_schema = 'your schema name' & 将输出存储在任何变量中,然后验证它是否为空......你应该没问题......

或使用

query = SELECT EXISTS (SELECT relname FROM pg_class WHERE relname = 'table 
name');
resp = cur.execute(query)
rows = cur.fetchone()
print(rows[0]) 

如果表存在则返回 True,否则返回 False....

【讨论】:

【参考方案2】:

您可以从信息架构中获取信息,例如:

SELECT table_schema,table_name
FROM information_schema.tables
WHERE table_name like 'pg_database';

【讨论】:

谢谢,但这只是返回None,与表是否存在无关。这是我尝试过的查询:tableExists = cursor.execute("SELECT 'mySchema','mytable_complement' FROM information_schema.tables WHERE 'mytable_complement' like 'pg_database';")。任何想法为什么?

以上是关于测试 PostgreSQL 表是不是不存在(使用 psycopg2)的主要内容,如果未能解决你的问题,请参考以下文章

如果不存在则插入行 postgresql

Postgresql 10 plpgsql 测试列是不是存在于记录变量中

PostgreSQL 学习之使用psycopg2 操作之数据库不存在才创建

在 PostgreSQL 中检查行是不是存在非常慢

PostgreSQL:如果不存在则创建表 AS

postgresql----temporary table和unlogged table