测试 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 10 plpgsql 测试列是不是存在于记录变量中