我需要向一个大的(5m行)django表添加一个新列。我有一个south schemamigration
创建新列。现在我正在编写一个datamigration
脚本来填充新列。看起来像这样。(如果您不熟悉south迁移,只需忽略模型名前面的orm.
。)
print "Migrating %s articles." % orm.Article.objects.count()
cnt = 0
for article in orm.Article.objects.iterator():
if cnt % 500 == 0:
print " %s done so far" % cnt
# article.newfield = calculate_newfield(article)
article.save()
cnt += 1
我从objects.all
切换到{
好像有什么东西在记忆中抓住了这些东西。我怎么能运行它,这样它就不会占用内存了?在
FWIW,我使用的是python2.6、django 1.2.1、south 0.7.2、mysql 5.1。在
确保
settings.DEBUG
设置为False
。DEBUG=True
使用数据库密集型操作填充内存,因为它将发送到RDBMS的所有查询存储在一个视图中。在随着django1.8的推出,它不应该是必需的,因为现在存储的是硬编码的最多9000个查询,而不是之前的无限数量。在
或者,如果您在原位创建一个实现基本resultset大小限制的原始查询,会发生什么情况?在
阿拉:https://docs.djangoproject.com/en/1.3/topics/db/sql/#index-lookups
欢迎来到Django的ORM。我认为这是一个固有的问题。在
我也遇到过大型数据库、dumpdata、loaddata等问题。在
你有两个选择。在
停止尝试使用south编写自己的ORM迁移。设置中可以有多个数据库定义。创造“旧”和“新”。编写从旧数据库到新数据库的一次性迁移程序。一旦测试并运行,最后运行一次,然后切换数据库定义并重新启动Django。
抛弃south和ORM,编写自己的SQL迁移。使用原始SQL将数据从旧结构复制到新结构。单独调试。好的时候,最后运行一次,然后切换设置并重新启动Django。
并不是说南部或是ORM特别糟糕。但是,对于大型数据库中的批量处理,它们在内存中缓存过多。在
相关问题 更多 >
编程相关推荐