使用SQLITE进行Google App Engine的本地Django开发?

时间:2014-01-23 08:06:03

标签: django sqlite google-app-engine

我正在使用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
>>> 

这里有人可以帮助我吗?我不知道下一步该做什么。提前谢谢!

2 个答案:

答案 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时,但是由于所有新实例都从原始文件开始,因此它当然不会扩展。