我正在尝试在Python 2.7上的Google App Engine 1.7.4上使用sqlite3支持Django 1.4。
我摆弄了“Google Cloud SQL”数据库后端,一切运行良好(syncdb,insert / update / delete,...)。
但后来我启用了sqlite(因为在使用localhost时Google Cloud SQL很慢):
import os
if (os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine') or
os.getenv('SETTINGS_MODE') == 'pushtolive'):
# Running on production App Engine, so use a Google Cloud SQL database.
DATABASES = {
'default': {
'ENGINE': 'google.appengine.ext.django.backends.rdbms',
'INSTANCE': 'xyz:xyz',
'NAME': 'my_database',
}
}
else:
# Running in development, so use a local SQLite database
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/tmp/mysite.db',
}
}
当我打开任何网址(例如127.0.0.1:8080)时,我会遇到this monstrous stack trace。我剥离了堆栈跟踪,因此它更具可读性:
ERROR 2012-12-29 09:07:06,223 base.py:215] Internal Server Error: /favicon.ico
Traceback (most recent call last):
File "/Users/philipp/python/mysite/urls.py", line 4, in <module>
from django.contrib import admin
File ".../google_appengine/lib/django_1_4/django/contrib/admin/__init__.py", line 3, in <module>
from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME
File ".../google_appengine/lib/django_1_4/django/contrib/admin/helpers.py", line 2, in <module>
from django.contrib.admin.util import (flatten_fieldsets, lookup_field,
File ".../google_appengine/lib/django_1_4/django/contrib/admin/util.py", line 1, in <module>
from django.db import models
File ".../google_appengine/lib/django_1_4/django/db/__init__.py", line 40, in <module>
backend = load_backend(connection.settings_dict['ENGINE'])
File ".../google_appengine/lib/django_1_4/django/db/__init__.py", line 34, in __getattr__
return getattr(connections[DEFAULT_DB_ALIAS], item)
File ".../google_appengine/lib/django_1_4/django/db/utils.py", line 92, in __getitem__
backend = load_backend(db['ENGINE'])
File ".../google_appengine/lib/django_1_4/django/db/utils.py", line 24, in load_backend
return import_module('.base', backend_name)
File ".../google_appengine/lib/django_1_4/django/utils/importlib.py", line 35, in import_module
__import__(name)
File ".../google_appengine/lib/django_1_4/django/db/backends/sqlite3/base.py", line 14, in <module>
from django.db import utils
ImportError: cannot import name utils
从堆栈跟踪中我读到执行运行到django.db.utils
模块,然后运行到django.db.backends.sqlite3.base
,然后它再次尝试跳转到django.db.utils
但是奇怪地失败了。
问题似乎出现在GAE环境中,因为这有效:
python mysite/manage.py syncdb
这也是:
python mysite/manage.py shell
>>> from django.contrib.auth.models import User
>>> u = User(username="hans")
>>> u.save()
>>> User.objects.all()
[<User: hans>]
到目前为止我尝试了什么:
我在OS X 10.8.2上
我的PYTHONPATH是:/usr/local/google_appengine:/usr/local/google_appengine/lib/django_1_4
答案 0 :(得分:4)
因为它是not good practice to use sqlite in dev and mysql (as used by Cloud SQL) in production我不建议任何人使用此设置。
然后,有--use_sqlite
选项:这用于加快使用Google数据商店时的开发速度。 Cloud SQL没有类似的选项。
答案 1 :(得分:4)
可以通过将_sqlite3
附加到_WHITE_LIST_C_MODULES
中的/usr/local/google_appengine/google/appengine/tools/dev_appserver_import_hook.py
将sqlite3模块列入白名单来解决此问题。
注意,您需要在应用引擎启动器中选择“制作符号链接...”才能从/usr/local
访问该文件。
答案 2 :(得分:1)
在最新版本的SDK中,您可以通过添加
在沙箱中启用sqlite3模块'sqlite3' in name.lower()
在google-app-engine / google / appengine / tools / devappserver2 / python / sandbox.py中的_should_keep_module函数中(第195行左右)