【问题标题】:How to know changing data of postgresql in last 5 seconds如何知道 postgresql 在过去 5 秒内更改的数据
【发布时间】:2016-06-18 03:54:55
【问题描述】:

我正在开发一个 Odoo 8 (OpenERP) 应用程序。该应用程序使用 postgresql 数据库。在Odoo 8 的后端,有添加销售订单 按钮。所以,我想知道,如何知道最后 5 秒的变化数据?我的需要是我想从移动应用程序中插入数据。那改变什么表?对此有任何疑问吗?或者另一个建议。 数据库有 314 个表。有没有像MONYog这样的part3的应用? 非常感谢任何帮助。

【问题讨论】:

    标签: android postgresql odoo-8


    【解决方案1】:

    对于这种情况,有一种最好的管理方式

    在每个表中始终使用两列作为“CreatedOn”和“LastUpdatedOn”,并在其中插入 proepr 值作为创建时间添加当前时间然后在每次更新时只需更改当前时间的最后更新时间,这样您就可以轻松根据您的要求获取数据。

    【讨论】:

    • 如您所知,数据库有 314 个表。除此之外,我不允许为该数据库添加列。有没有像MONYog这样的part3的应用?
    【解决方案2】:

    你也可以像这样添加一个函数:

    create or replace function notify_table_change() RETURNS TRIGGER
    LANGUAGE PLPGSQL AS
    $$
    NOTIFY all_writes TG_RELNAME;
    IF TG_OP = 'DELETE' THEN RETURN OLD; ELSE RETURN NEW; END OF;
    $$;
    

    然后您可以为所有插入、更新和删除添加触发器(但不能截断,因为我没有处理)。

    然后客户可以:

     LISTEN all_writes;
    

    并且将获得实时更新哪些表的实时通知。

    【讨论】:

      【解决方案3】:

      监控数据库对这个问题的处理方法感觉有点奇怪。为 odoo(和 OpenERP)编写自定义模块非常简单明了。我会创建一个模块来触发你想做的任何事情。

      这里是最简单的 OpenERP / odoo 模块的简单示例:

      from osv import osv
      class my_custom_module(osv.osv):
          _inherit = 'sale.order'
          _name = 'sale.order'
      
          def create(self, cr, uid, vals, ctx={}):
              <your code here, whatever you want to do when new sale.order obejcet is created >
              return super(my_custom_module, self).create(cr, uid, vals, ctx)
          my_custom_module()
      

      【讨论】:

        【解决方案4】:

        这有帮助吗?

        在实时商业应用中。我使用的方法是 creationupdate 日期/时间戳列。

        例子

        create table foo (
        foo_id serial not null unique, 
        created_timestamp timestamp not null default current_timestamp, 
        updated_timestamp timestamp not null default current_timestamp
        ) with oids;
        

        完成工作的触发器

        CREATE TRIGGER check_table_to_do_update
        --What i want to do
        

        桌子上的触发器

        CREATE TRIGGER check_update_foo
        AFTER UPDATE ON foo
        FOR EACH ROW
        WHEN (OLD.updated_timestamp IS DISTINCT FROM NEW.updated_timestamp)
        EXECUTE PROCEDURE check_table__to_do_update();
        

        其他任何事情都会给系统带来不必要的开销。

        一切顺利

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-16
          • 1970-01-01
          • 1970-01-01
          • 2014-12-26
          • 1970-01-01
          相关资源
          最近更新 更多