关于python:在内存中有一个简单的django sqlite3数据库示例吗?

Is there a simple django example of sqlite3 db working in memory?

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

  • 使内存中的数据库运行
  • 附加磁盘数据库(文件)
  • 重新创建表/索引并复制内容
  • 分离磁盘数据库(文件)
  • 但是他对我来说都是新的,我在实现这些方面有问题。

    到目前为止,我写过:

    设置.py

    1
    2
    3
    4
    5
    6
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': ':memory:',
        }
    }

    App.Py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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

    我也试过了

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

    但是,这似乎不起作用-我仍然有未应用的迁移,并且"没有这样的表"异常。


    你找错树了。

    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。