有没有一个简单的 django 例子 sqlite3 db 在内存中工作?



我正在尝试制作在内存(生产中)中的sqlite3 db上运行的Django应用程序。步骤似乎很简单

  1. 运行内存中数据库
  2. 附加磁盘数据库(文件)
  3. 重新创建表/索引并复制内容
  4. 分离磁盘数据库(文件)

但他对我来说都是新的,我在实施它们时遇到了问题。

到目前为止,我已经写过:

settings.py

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

app.py

from django.apps import AppConfig
import sqlite3
import os
from StringIO import StringIO
from django.conf import settings
class EnquirerConfig(AppConfig):
name = 'enquirer'
def ready(self):
con = sqlite3.connect(os.path.join(settings.BASE_DIR, 'db.sqlite3'))
tempfile = StringIO()
for line in con.iterdump():
tempfile.write('%sn' % line)
con.close()
tempfile.seek(0)
sqlite = sqlite3.connect(":memory:")
sqlite.cursor().executescript(tempfile.read())
sqlite.commit()
sqlite.row_factory = sqlite3.Row

这一切都基于以下内容: 如何在Python sqlite3中将现有的数据库文件加载到内存中? Django - 在生产中的内存 sqlite

我也试过

if settings.DATABASES['default']['NAME'] == ':memory:':
call_command('migrate', interactive=True)

但是,这似乎不起作用 - 我仍然有未应用的迁移和"没有这样的表"例外。

你在这里吠错了树。

强制 SQLite 数据库纯粹存在于内存中的最常见方法是使用特殊文件名":memory:"打开数据库。 完成此操作后,不会打开任何磁盘文件。相反,新数据库纯粹是在内存中创建的。数据库连接关闭后,数据库将立即停止存在。每个 :memory: 数据库都与其他数据库不同。因此,打开两个数据库连接,每个连接文件名为":memory:"将创建两个独立的内存中数据库。

https://sqlite.org/inmemorydb.html

因此,您必须不断将数据同步到磁盘。这与使用基于磁盘的 sqlite3 数据库完全相同。

其次,如果您的 wsgi 容器使用两个线程,则最终可能会得到两个不同的数据库,并且同一用户在后续页面加载中看到两个不同的内容。

最后但并非最不重要的一点是,大多数类 unix 操作系统都具有出色的文件系统缓存。如果有足够的内存可用,它将通过加快访问速度将常用文件保留在缓存中。这发生在内核级别,并且比使用 python 甚至用户空间 C 实现的任何速度都要快得多。

上述声明适用于实际和数据库,无论是RDBMS还是noSQL。

最新更新