Django - 生产环境中的内存 SQLite

24

我有一个大小为10MB的只读sqlite3数据库,用于生产。

我想加快我的网站速度,所以我正在尝试在每次Django启动时从磁盘加载整个数据库到内存中。

这个答案解释了如何在flask中实现: https://dev59.com/LG865IYBdhLWcg3wYNZS#10856450

是否有类似的Django解决方案?


4
如果你想使用Django的ORM,那么可能不能这样做,因为这需要预先生成模式。对于小型数据库,大部分数据应该已经被缓存了,所以显式地将其加载到RAM中不太可能会有帮助。 - Colonel Thirty Two
“生成架构预先准备”是什么意思?虽然它是缓存的,但我认为默认缓存大小仅为2MB,而且数据库可能会变得更大,达到50MB,所以我仍然更喜欢显式地将其加载到内存中。 - Dan Bolofe
我的意思是 CREATE TABLE 语句。Django 不会在启动时运行它们,需要先运行 manage.py setupmanage.py migrate。缓存大小可以通过 cache_size pragma 进行调整(您可能需要使用原始 SQL 语句进行修改)。 - Colonel Thirty Two
但是我正在尝试使用iterdump()将现有数据库加载到内存中,然后像这个答案https://dev59.com/LG865IYBdhLWcg3wYNZS#10856450中那样执行脚本,所以我不需要担心“create table”,因为它已经被iterdump()覆盖了。我的问题是,在创建了包含所有数据的内存数据库之后,我不知道如何告诉django使用这个内存数据库。 - Dan Bolofe
1个回答

40

配置内存数据库:

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': ':memory:',
  }
}

将您链接的代码作为启动脚本放置(请参考Execute code when Django starts ONCE only?)。


1
但是Django会在内存中创建一个新的数据库,我该如何告诉Django使用我加载的现有内存数据库?我需要将Django指向连接或StringIO对象或其他内容。 - Dan Bolofe
@DanBolofe 你不能将字节数组作为数据库加载;SQLite根本不支持这样做。 - Colonel Thirty Two
你可以将所有内容转储为SQL语句,然后执行它们 - 参见:https://dev59.com/LG865IYBdhLWcg3wYNZS#10856450 - Dan Bolofe
@DanBolofe 然后运行SQL脚本,使用Adrian连接的在Django启动时运行代码的指令。 - Colonel Thirty Two
我想这真的是最好的选择,将SQL转储,然后使用cursor.execute()执行原始SQL,谢谢。 - Dan Bolofe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接