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

6
我正在使用Google App Engine进行Django开发。在生产环境中,我计划使用Google Cloud SQL,但在本地开发中我想使用简单的SQLITE。谷歌教程(https://developers.google.com/appengine/docs/python/cloud-sql/django)建议我使用以下命令运行开发服务器:
dev_appserver.py mysite

使用Django默认设置的代替方案

manage.py runserver

然而,当我按照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"

最奇怪的是,当我只使用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个回答

7
这个问题非常古老,提出的解决方案是可以接受的。然而,我认为我的答案对于App Engine用户也可能很有趣。
所有与sqlite相关的问题都源于App Engine环境是无状态的事实。您无法编写或修改本地文件系统中的文件。 Dev环境模拟这种行为。 然而,有一个文件夹是可写的:/ tmp / 这在Dev环境中也应该是这种情况。 像下面这样的简单技巧可以使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,
    }
}

这个解决方案适用于将db.sqlite3与应用程序一起部署的情况,但它显然不可扩展,因为所有新实例都从原始文件开始。

3

我曾经遇到同样的问题,直到意识到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数据库,但是你将无法在实体之间定义“强大”的关系(外键)。

谢谢Christophe!我最终放弃了,基本上得出了与您建议相同的结论。一开始我认为这是一个逃避责任的行为,但很高兴听到似乎是GAE方面的支持问题。我现在将其标记为已回答。(顺便说一句:对于我的迟到回复感到抱歉,我认为我在注册时没有正确设置通知,所以不知道您已经回答了我的问题) - jameschen810

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接