【问题标题】:Delete all data in all tables older than period using date column使用日期列删除所有早于期间的表中的所有数据
【发布时间】:2013-03-29 23:32:39
【问题描述】:

我有一组表,它们都有一个日期列(没有时区的时间戳)等于插入的时间。

如何使用日期列删除所有表中超过 24 小时的所有数据,最好不使用模型显式删除每个表?

这就是我现在从所有表中删除所有内容的方法,但是在添加日期测试时感觉有些不便。

#!/usr/bin/env python

import sqlalchemy

engine = sqlalchemy.create_engine('postgresql+psycopg2://user:password@host:port/database')
meta = sqlalchemy.MetaData()
meta.reflect(bind=engine)

for table in reversed(meta.sorted_tables):
    engine.execute(table.delete())

【问题讨论】:

  • 您要删除表中的所有行吗?无法从代码中分辨出来。如果是这样,您可以使用 truncate 代替 delete - 在 pg 中,快得多
  • 是的,它会删除使用 sqlalchemy.MetaData().reflect() 检索到的每个表中的所有内容。如果你想删除整个表,你的截断是对的,但这不是我想要的,它似乎超出了我的问题范围。
  • 这很酷。知道pg,但根本不明白你的问题。祝你好运!

标签: python postgresql datetime python-2.7 sqlalchemy


【解决方案1】:

以下应该这样做:

import datetime
too_old = datetime.datetime.today() - datetime.timedelta(days=1)
for table in reversed(meta.sorted_tables):
    engine.execute(table.delete().where(table.c.timestampinserted <= too_old))

请注意,如果您有 foreign key constraints,您可能会遇到问题。如果表被 foreign key constraint 引用,truncate 也不起作用。

【讨论】:

  • 虽然您的代码存在一些错误(我对其进行了修改),但这个想法是正确的,并且运行良好,谢谢!
  • @TimSæterøy 您建议的编辑已被 3 位审阅者拒绝(不能真正责怪他们,当前的审阅系统几乎没有上下文)。我已经重做了你对答案的编辑。如果有的话,请再次尝试编辑或@我。
  • @FabrícioMatté 哦,好的。我没有听说审查系统有任何问题,但无论如何感谢。接受的答案至少应该是正确的语法:)
  • @TimSæterøy 正是我手动进行更新的原因。 :P 虽然我不是很喜欢 Meta 的人,但我应该提出这个作为对 Meta 的改进建议。
  • @TimSæterøy 好的,我在 Meta here 上发表了我的第一篇实际帖子。
猜你喜欢
  • 1970-01-01
  • 2016-03-28
  • 2022-08-13
  • 1970-01-01
  • 2011-04-05
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多