是否有一个简单的django示例sqlite3 db在内存中工作?

时间:2017-06-12 23:58:03

标签: python django memory sqlite

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

  1. 获取正在运行的内存数据库
  2. 附加磁盘数据库(文件)
  3. 重新创建表/索引并复制内容
  4. 分离磁盘数据库(文件)
  5. 但他对我来说是全新的,我在实施它们时遇到了问题。

    到目前为止,我写过:

    settings.py

    i = 0 
    with open('wyz.txt') as f:
         for line in f:
              if "2017" in line:
                   i = i + 1
    

    app.py

    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
    

    但是,这似乎不起作用 - 我仍然有未应用的迁移和'没有这样的表'例外。

1 个答案:

答案 0 :(得分:1)

你在这里咆哮错误的树。

  

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

https://sqlite.org/inmemorydb.html

所以你必须不断地将数据同步到磁盘。这与使用基于磁盘的sqlite3数据库完全相同。

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

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

以上陈述实际上适用于RDBMS或noSQL。