【问题标题】:Using SQLITE for local Django development for Google App Engine?使用 SQLITE 为 Google App Engine 进行本地 Django 开发?
【发布时间】:2014-02-13 16:08:49
【问题描述】:

我正在使用 Google App Engine 在 Django 中进行开发。对于生产,我计划使用 Google Cloud SQL,但对于本地开发,我想使用简单的 SQLITE。 Google 教程 (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 时,站点运行良好。此外,当我直接在交互式 python 提示符中测试 sqlite3 时,它也可以工作:

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
>>> 

这里有人可以帮助我吗?我不确定下一步该怎么做。提前致谢!

【问题讨论】:

    标签: django sqlite google-app-engine


    【解决方案1】:

    我偶然发现了同一块石头,直到我意识到 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 数据库,但您将无法在实体之间定义“强”关系(外键)。

    【讨论】:

    • 感谢克里斯托夫!我最终放弃了,基本上得出了与您建议的相同的结论。我最初认为这是一个逃避,但我很高兴听到这似乎是 GAE 方面的支持问题。我暂时将此标记为已回答。 (顺便说一句:很抱歉回复晚了,我认为我在注册时没有正确设置通知,所以不知道您已经回答了我的问题)
    【解决方案2】:

    这个问题很老了,建议的解决方案还可以。不过,我相信我的回答对于 App Engine 用户来说也会很有趣。

    sqlite 的所有问题都源于 App Engine 环境是无状态的。您不能写入或修改本地文件系统的文件。开发环境模拟了这种行为。 但是,有一个文件夹是可写的:/tmp/ 开发环境也应该如此。 像下面这样的一个简单技巧可以使 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 与应用程序一起部署时,它当然不会扩展,因为所有新实例都从原始文件开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-04
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 2011-11-10
      • 2017-10-19
      相关资源
      最近更新 更多