hansaplast
hansaplast

Reputation: 11573

Django 1.4 on GAE: sqlite "ImportError: cannot import name utils"

I'm trying to get sqlite3 support working on Django 1.4 on Google App Engine 1.7.4 on Python 2.7.

I fiddled around with the "Google Cloud SQL" database backend, all worked well (syncdb, insert/update/delete, ...).

But then I enabled sqlite (as Google Cloud SQL is slow when on localhost):

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',
        }
    }

and when I open any url (e.g. 127.0.0.1:8080) then I run into this monstrous stack trace. I stripped down the stack trace so it's more readable:

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

From the stack trace I read that the execution runs to the django.db.utils module, then into django.db.backends.sqlite3.base, then it tries to jump into django.db.utils again but that then strangely fails.

The problem seems to be in the GAE environment, since this works:

python mysite/manage.py syncdb

And this as well:

python mysite/manage.py shell
>>> from django.contrib.auth.models import User
>>> u = User(username="hans")
>>> u.save()
>>> User.objects.all()
[<User: hans>]

What I tried so far:

I'm on OS X 10.8.2 My PYTHONPATH is :/usr/local/google_appengine:/usr/local/google_appengine/lib/django_1_4

Upvotes: 3

Views: 2014

Answers (3)

georgerw
georgerw

Reputation: 146

In the latest version of the SDK, you can enable the sqlite3 module in the sandbox by adding

'sqlite3' in name.lower()

in the _should_keep_module function in google-app-engine/google/appengine/tools/devappserver2/python/sandbox.py (around line 195)

Upvotes: 1

Martin Ogden
Martin Ogden

Reputation: 882

This can be resolved by whitelisting the sqlite3 module by appending _sqlite3 to _WHITE_LIST_C_MODULES in /usr/local/google_appengine/google/appengine/tools/dev_appserver_import_hook.py.

Note, you'll need to have selected "Make Symlinks..." in the app engine launcher to to access the file from /usr/local.

Upvotes: 4

hansaplast
hansaplast

Reputation: 11573

As it's not good practice to use sqlite in dev and mysql (as used by Cloud SQL) in production I don't recommend this setup to anyone.

Then, there is the option --use_sqlite: This is used to speed up development when using the Google Datastore. There is no similar option for Cloud SQL.

Upvotes: 4

Related Questions