我正在使用Google App Engine在Django中进行开发。对于制作我计划使用Google Cloud SQL,但对于本地开发,我想使用简单的SQLITE。 Google Tutorial(https://developers.google.com/appengine/docs/python/cloud-sql/django)建议我使用
运行开发服务器dev_appserver.py mysite
而不是Django默认
manage.py runserver
但是,当我按照谷歌的建议运行开发服务器时,我得到两个奇怪的错误(为了清楚起见,我删除了其余的堆栈跟踪):
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"
最奇怪的是,当我使用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
>>>
这里有人可以帮助我吗?我不知道下一步该做什么。提前谢谢!
答案 0 :(得分:2)
我偶然发现同一块石头,直到我意识到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"},
}
}
否则你也可以免费使用他们的NDB数据库,但是你将无法在你的实体之间定义“强”关系(外键)。
答案 1 :(得分:2)
问题很老,建议的解决方案还可以。但是,我相信我的回答对App Engine用户也很有趣。
sqlite的所有问题均来自App Engine环境为无状态的事实。您不能编写或修改本地文件系统的文件。开发环境模拟了这种行为。 但是,有一个可写的文件夹:/ tmp / 开发环境也应如此。 当用户不在乎将数据保存在dbsqlite中时,如下所示的简单技巧可使sqlite用于DEV甚至是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,
}
}
例如,此解决方案运行与应用程序一起部署db.sqlite3时,但是由于所有新实例都从原始文件开始,因此它当然不会扩展。