jam*_*810 6 sqlite django google-app-engine
我正在使用 Google App Engine 在 Django 中进行开发。对于生产,我计划使用 Google Cloud SQL,但对于本地开发,我想使用简单的 SQLITE。Google 教程(https://developers.google.com/appengine/docs/python/cloud-sql/django)建议我运行开发服务器
dev_appserver.py mysite
Run Code Online (Sandbox Code Playgroud)
而不是 Django 默认的
manage.py runserver
Run Code Online (Sandbox Code Playgroud)
然而,当我按照 Google 建议运行开发服务器时,我收到两个奇怪的错误(为了清楚起见,我删除了堆栈跟踪的其余部分):
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django1.5/django/db/backends/sqlite3/base.py", line 34, in <module>
raise ImproperlyConfigured("Error loading either pysqlite2 or sqlite3 modules (tried in that order): %s" % exc)ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/core/handlers/base.py", line 53, in load_middleware
raise exceptions.ImproperlyConfigured('Error importing middleware %s: "%s"' % (mw_module, e)) ImproperlyConfigured: Error importing middleware django.contrib.auth.middleware: "cannot import name utils"
Run Code Online (Sandbox Code Playgroud)
最奇怪的部分是,当我只使用 manage.py runserver 时,该网站工作正常。另外,当我直接在 sqlite3 的交互式 python 提示符中进行测试时,它也可以工作:
Python 2.7.5 (default, Aug 25 2013, 00:04:04)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>>
Run Code Online (Sandbox Code Playgroud)
这里有人可以帮助我吗?我不知道下一步该做什么。提前致谢!
这个问题很老了,建议的解决方案还可以。不过,我相信我的答案对于 App Engine 用户来说也会很有趣。
sqlite 的所有问题都源于 App Engine 环境是无状态的这一事实。您无法写入或修改本地文件系统的文件。开发环境模拟这种行为。然而,有一个可写的文件夹: /tmp/ 开发环境也应该是这种情况。像下面这样的简单技巧可以使 sqlite 可用于 DEV 目的,甚至在不关心在 dbsqlite 中保留数据时用于 PROD 情况。在settings.py中可以做这样的事情:
DB_PATH = os.path.join(BASE_DIR, 'db.sqlite3')
try:
from shutil import copyfile
DB_PATH = "/tmp/db.sqlite3"
copyfile(os.path.join(BASE_DIR, 'db.sqlite3'), DB_PATH)
except:
pass
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': DB_PATH,
}
}
Run Code Online (Sandbox Code Playgroud)
例如,当 db.sqlite3 与应用程序一起部署时,此解决方案会运行,但它当然无法扩展,因为所有新实例都以原始文件开头。
我偶然发现了同样的问题,直到我意识到 GAE 不允许你使用 SQLite,至少不是开箱即用的......
因此,他们的开发服务器也不允许这样做,以防止部署时出现任何意外情况。
尽管可能有办法,因为 Google Appengine 文档有时会引用一些“SQlite Stub”,但我无法安全地浏览他们的文档丛林,也没有找到最近的、像样的、有效的示例。
就目前而言,一种解决方案是:如果您需要关系数据库,请使用 mysql,但一旦在 GAE 上推出,您就必须支付订阅费用。请注意,定价可能非常便宜。
以下是 settings.py 文件的声明示例:
if (os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine') or
os.getenv('SETTINGS_MODE') == 'prod'):
# Running on production App Engine, so use a Google Cloud SQL database.
DATABASES = {
'default': {
'ENGINE': 'google.appengine.ext.django.backends.rdbms',
'INSTANCE': '<project>-pts:ptsdb',
'NAME': '<dbname>',
'OPTIONS': {"init_command": "SET storage_engine=INNODB"},
}
}
else:
# Running in development, so use a local MySQL database.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '<dbname>',
'USER': '<username>',
'PASSWORD': '',
'HOST': 'localhost',
'OPTIONS': {"init_command": "SET storage_engine=INNODB"},
}
}
Run Code Online (Sandbox Code Playgroud)
否则,您也可以免费使用他们的 NDB 数据库,但您将无法定义实体之间的“强”关系(外键)。
| 归档时间: |
|
| 查看次数: |
3908 次 |
| 最近记录: |