我正在尝试制作在内存中的sqlite3 db上运行的Django应用程序(在生产中)。步骤似乎很简单
但他对我来说是全新的,我在实施它们时遇到了问题。
到目前为止,我写过:
i = 0
with open('wyz.txt') as f:
for line in f:
if "2017" in line:
i = i + 1
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
}
}
这完全基于以下内容: How to load existing db file to memory in Python sqlite3? Django - in memory sqlite in production
我也试过
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('%s\n' % line)
con.close()
tempfile.seek(0)
sqlite = sqlite3.connect(":memory:")
sqlite.cursor().executescript(tempfile.read())
sqlite.commit()
sqlite.row_factory = sqlite3.Row
但是,这似乎不起作用 - 我仍然有未应用的迁移和'没有这样的表'例外。
答案 0 :(得分:1)
你在这里咆哮错误的树。
强制SQLite数据库纯粹存在于内存中的最常用方法是使用特殊文件名“:memory:”打开数据库... 完成后,不会打开任何磁盘文件。而是在内存中创建一个新的数据库。数据库连接关闭后,数据库就不再存在。 Every:memory:数据库彼此不同。因此,打开两个数据库连接,每个连接的文件名为“:memory:”,将创建两个独立的内存数据库。
https://sqlite.org/inmemorydb.html
所以你必须不断地将数据同步到磁盘。这与使用基于磁盘的sqlite3数据库完全相同。
其次,如果你的wsgi容器使用两个线程,你可能最终得到两个不同的数据库,同一个用户在后续页面加载时会看到两个不同的内容。
最后但同样重要的是,大多数类似操作系统的unix都具有出色的文件系统缓存。如果有足够的内存可用,它会通过加快访问速度将常用文件保存在其缓存中。这种情况发生在内核级别,并且比使用python甚至用户空间C实现的速度快得多。
以上陈述实际上适用于RDBMS或noSQL。