【发布时间】:2017-06-12 23:58:03
【问题描述】:
我正在尝试制作在内存中的 sqlite3 db 上运行的 Django 应用程序(在生产中)。步骤看似简单
- 让内存数据库运行
- 附加磁盘数据库(文件)
- 重新创建表/索引并复制内容
- 分离磁盘数据库(文件)
但他对我来说是全新的,我在实施它们时遇到了问题。
到目前为止,我已经写了:
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('%s\n' % line)
con.close()
tempfile.seek(0)
sqlite = sqlite3.connect(":memory:")
sqlite.cursor().executescript(tempfile.read())
sqlite.commit()
sqlite.row_factory = sqlite3.Row
这一切都基于以下几点: How to load existing db file to memory in Python sqlite3? Django - in memory sqlite in production
我也试过
if settings.DATABASES['default']['NAME'] == ':memory:':
call_command('migrate', interactive=True)
但是,这似乎不起作用 - 我仍然有未应用的迁移和“没有这样的表”异常。
【问题讨论】:
-
您能解释一下为什么要这样做吗?这不可能是为了性能,因为您只能以这种方式运行单个进程;使用标准数据库和多个服务器进程会更好。另外,当然,每当流程重新启动时,您都会丢失所有数据。那为什么呢?
-
这个想法是在重新启动时丢失所有数据:) 用户输入机密的财务数据,因此能够告诉他们所有进程都在内存中运行并且应用程序不存储数据是非常重要的。
-
你试过我的答案了吗?
-
目前正在努力,可能不会早于明天完成。谢谢你的发言。至于每个页面加载的新数据库,这实际上是这个实现中想要的东西。问题是,在生产中将 db 存储在内存中是否是一个好主意。也许制作临时数据库会更好,因为它与不断同步数据库相同,并且性能在这里是次要问题。关键是可以对客户说他的数据是在内存或磁盘上处理的。有什么想法吗?
-
正如我在回答中已经解释的那样。如果您为 RDBMS 提供足够的内存,他的数据将始终在内存中处理。
标签: python django memory sqlite