【问题标题】:Is there a simple django example of sqlite3 db working in memory?是否有在内存中工作的 sqlite3 db 的简单 django 示例?
【发布时间】:2017-06-12 23:58:03
【问题描述】:

我正在尝试制作在内存中的 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('%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


【解决方案1】:

你在这里叫错树了。

强制 SQLite 数据库纯粹存在于内存中的最常见方法是使用特殊文件名“:memory:”打开数据库... 完成后,不会打开任何磁盘文件。相反,一个新的数据库是纯粹在内存中创建的。一旦数据库连接关闭,数据库就不再存在。每个 :memory: 数据库都彼此不同。因此,打开两个数据库连接,每个连接的文件名为“:memory:”,将创建两个独立的内存数据库。

https://sqlite.org/inmemorydb.html

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多