Is there a simple django example of sqlite3 db working in memory?
我正在尝试制作在sqlite3 db内存上运行的django应用程序(在生产中)。步骤似乎很简单
但是他对我来说都是新的,我在实现这些方面有问题。
到目前为止,我写过:
设置.py1 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。