【问题标题】:firing a script when table datetime passes now()当表日期时间通过 now() 时触发脚本
【发布时间】:2018-12-27 01:36:09
【问题描述】:

我已从数据库中删除,并正在尝试重新使用它。我记得很久以前创建了一个类似 EBAY 的应用程序,您可以在其中创建一个带有结束日期的拍卖,当日期过去时,它将被关闭。如果我记得有 2 个属性。

我正在尝试创建一些类似的东西。用户将定义一个日期时间,当该日期发生时,它将触发一个 python 脚本。我认为它不一定会触发脚本,但一个不错的选择是:如果 datetime

我正在努力记住关键字。

理想情况下,我想让数据库处理所有的提升,然后由于 now() 超过了表的日期时间列,它会在删除自身之前执行一个 python 脚本。

作为替代方案,我可以将条目移动到另一个表进行处理。

我不认为这是一个触发器,因为这似乎意味着将某种条目插入到数据库中。我只是在考虑某种检查表约束的被动函数。

我的所有代码都在 python 中,但对免费 DBMS 开放,但倾向于 MySQL 或 SQLAlchemy

我知道,对于我的简单概念证明,我需要一个类似于以下内容的表格:

USER_ID varchar(60)
URL varchar(250)
COMMENT varchar(1000)
SUBMISSION_DATE datetime
PROCESS_DATE datetime

【问题讨论】:

  • 您可能会想到event,但它确实不是在数据库之外执行代码的正确位置。通常这样做的地方是cronjob。如果您想在数据库中管理您的任务,您可能会每 x 秒运行一次 cronjob,该任务运行一个脚本,检查(在数据库中)某个任务是否到期,然后执行它(从脚本中)。在一个应用程序(持续运行)中,您可以使用任何形式的计时器来完成基本相同的操作。
  • 我在想,为了保持数据库的封装,我可以创建一个事件或触发器,当 PROCESS_DATE 到来时,将条目转移到不同的桌子。对于一个用例,如果您熟悉 Reddit 上的 RemindMe 机器人,我正在涉足类似的东西,但更具可扩展性和效率。该代码使用 Query 持续扫描数据库以检查日期时间,但处理过程过于繁重,如果按比例放大,则不可持续。这样,我可以创建一个循环来监视一个较小的表
  • 虽然我不知道那个机器人,但您准确地描述了如果 MySQL 提供这样的功能,它在内部必须做什么:它基本上必须不断检查每个表中的每一行。然而,作为改进,MySQL 可以在日期列上添加一个带有索引的表(基本上:按时间排序),并在那里添加所有事件;然后它将扫描第一行,如果 date now,则可以停止;因为它是按日期排序的,所以之后的所有行都有日期>现在。仔细想想,一个应用程序也可以做到这一点。
  • DBMS 在内部完成任务时通常比在游标监视事物时锁定它的外部资源更有效。我记得在 Oracle 中有类似的东西,其中有一个很好的优化技术,我忘记了,因为我从 Oracle 退出了。话虽如此,是的,您可以索引完成日期。我想你可以创建一个视图来显示该信息,然后可以循环播放,然后删除/添加到备份光盘以供监控使用。
  • @Solarflare 我认为这可能是一个足够的答案。如果您可以创建一个示例表,上面给出的表,但带有索引,以及适当获取该信息的视图,我认为它证明了一个有效的答案。

标签: mysql database sqlalchemy relational-database


【解决方案1】:

经过一些讨论,有人指出,为了加快速度,请在处理日期上使用索引。这样表就可以快速迭代。其次,我发现创建一个视图来获取我需要处理的信息并利用索引很聪明。

create table if not exists T(
  USER_ID nvarchar(60),
  URL nvarchar(250),
  CONTENT nvarchar(700),
  SUBMISSION_DATE datetime,
  PROCESS_DATE datetime,
  index PROCESS_DATE_IDX using BTREE (PROCESS_DATE)
);

create or replace view T_Vw as SELECT * FROM T where PROCESS_DATE < now();

根据已查看列的使用情况,将旧条目转储到存储表中可能是明智之举。

create table if not exists T_BK(
  USER_ID nvarchar(60),
  URL nvarchar(250),
  CONTENT nvarchar(700),
  SUBMISSION_DATE datetime,
  PROCESS_DATE datetime,
  index PROCESS_DATE_IDX using BTREE (PROCESS_DATE)
);

DELIMITER $$
CREATE TRIGGER T_tgr BEFORE DELETE ON Tweet FOR EACH ROW
BEGIN
   insert into T_BK ('USER_ID', 'URL', 'CONTENT', 'SUBMISSION_DATE', 'PROCESS_DATE') values (OLD.USER_ID, OLD.URL, OLD.CONTENT, OLD.SUBMISSION_DATE, OLD.PROCESS_DATE);
END; $$
DELIMITER ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多