我正在尝试制作在sqlite3 db内存上运行的django应用程序(在生产中)。步骤似乎很简单
使内存中的数据库运行
附加磁盘数据库(文件)
重新创建表/索引并复制内容
分离磁盘数据库(文件)
但是他对我来说都是新的,我在实现这些方面有问题。
到目前为止,我写过:设置.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('%s
' % line)
con.close()
tempfile.seek(0)
sqlite = sqlite3.connect(":memory:")
sqlite.cursor().executescript(tempfile.read())
sqlite.commit()
sqlite.row_factory = sqlite3.Row
号
这一切都基于以下几点:如何在python sqlite3中将现有的db文件加载到内存中?Django-生产中的内存sqlite
我也试过了
if settings.DATABASES['default']['NAME'] == ':memory:':
call_command('migrate', interactive=True)
但是,这似乎不起作用-我仍然有未应用的迁移,并且"没有这样的表"异常。
你能解释一下你为什么要这样做吗?它不能是为了性能,因为您只能以这种方式运行一个进程;使用标准数据库和多个服务器进程会更好。另外,当然,当进程重新启动时,您将丢失所有数据。为什么?
这样做的目的是在重新启动时丢失所有数据:)用户输入机密的财务数据,这样就可以告诉他们所有的进程都在内存中运行,而应用程序不存储任何数据非常重要。
你试过我的答案了吗?
目前正在努力,可能会在明天前完成。谢谢你的评论。对于每个页面加载的新DB,在这个实现中这实际上是一个期望的事情。问题是,在生产环境中将数据库存储在内存中是否是一个好主意。也许制作临时数据库会更好,因为它与持续同步数据库相同,而且性能是这里的次要问题。关键是,可以对客户机说他的数据是在内存或磁盘上处理的。有什么想法吗?
我已经在回答中解释过了。如果为RDBMS提供足够的内存,则其数据将始终在内存中处理。
你找错树了。
The most common way to force an SQLite database to exist purely in memory is to open the database using the special filename":memory:" ...
When this is done, no disk file is opened. Instead, a new database is created purely in memory. The database ceases to exist as soon as the database connection is closed. Every :memory: database is distinct from every other. So, opening two database connections each with the filename":memory:" will create two independent in-memory databases.
号
https://sqlite.org/inmemorydb.html
所以您必须不断地将数据同步到磁盘。这与使用基于磁盘的sqlite3数据库完全相同。
其次,如果您的wsgi容器使用两个线程,您可能最终会得到两个不同的数据库和相同的用户,在随后的页面加载中看到两个不同的内容。
最后但并非最不重要的是,大多数类Unix操作系统都具有出色的文件系统缓存。如果有足够的内存,它将通过加快访问速度将经常使用的文件保存在缓存中。这发生在内核级别,并且将比用Python甚至用户空间C实现的任何东西都快得多。
以上语句适用于实际和数据库,无论是RDBMS还是NoSQL。