【问题标题】: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]

【问题讨论】:

  • 另一种选择是检查pg_databasepostgresql.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


【解决方案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';")。任何想法为什么?
    猜你喜欢
    • 2015-03-06
    • 2010-12-24
    • 1970-01-01
    • 2021-04-24
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2011-08-04
    相关资源
    最近更新 更多