【问题标题】:Postgres select only if table existsPostgres 仅在表存在时选择
【发布时间】:2015-05-06 02:18:48
【问题描述】:

如何执行

select * from my_table

但如果 my_table 不存在,请避免抛出错误

有可能吗?

更新:我在 Odoo 中工作,我在用户按下按钮时创建表,所以当我的模块第一次安装时,表将不存在,我不想看到错误。

我用 python 解决了这个问题:

try: cr.execute(my_query)
expetion: pass

对不起,如果我不够明确,这是我在这里的第一个问题:P

【问题讨论】:

  • 通过检查数据库元数据/模式信息表 - 这取决于 Postgre 存储它们的位置(即 MySQL 具有保存此类信息的特定表,在 Oracle 中可以从视图中查询它们)。您需要查看 DBMS 文档。
  • 你怎么可能从一个不存在的表中查询?
  • 奇怪的情况,不过你可以先查一下:postgresql.org/docs/current/interactive/infoschema-tables.html
  • 你可以将它包装到一个函数中并在 PL/pgSQL 中捕获错误,但是你需要这样做select * from my_table_function()
  • 如果没有表,查询应该返回什么?

标签: python postgresql select exists


【解决方案1】:

您是否在某种函数中运行它?如果不是,那么整个问题毫无意义......如果是 - 只需尝试捕获错误,如下所述:http://www.postgresql.org/docs/9.1/static/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING

您需要捕获42P01 undefined_table SQLSTATE。

所以在你的函数中你可以这样做:

BEGIN
  SELECT * FROM sometable
EXCEPTION 
  WHEN undefined_table THEN
    -- Do something
  WHEN others THEN
    -- Do something else
END;

【讨论】:

  • 非常感谢。我正在从 Python 中的函数发送查询。谢谢你,我发现 Python 有一个 try-expetion 函数来避免预期的错误
  • 这似乎是一个完全不同的情况 :) 我的意思是在 PL/pgSQL 函数中捕获错误(过程在服务器端运行)。您写的是在客户端捕获错误。无论如何 - 很高兴我能提供帮助。
【解决方案2】:

作为附加说明(与 Postgresql 无关),当您启动 Odoo 服务器时,您应该确保设置了 -u 标志以确保您的 odoo 自定义被 Odoo ORM 应用。这可确保您所做的任何修改(例如表创建/修改)都应用于您的 Postgresql 数据库。

所以,从 CLI:

openerp-server -u module_name

openerp-server -u all

更新所有模块

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-02
    • 2015-03-30
    • 2021-12-18
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多