Skip to main content
 首页 » 编程设计

python之谷歌应用引擎、云 sql 和 django : no rdbms backend module

2025年05月04日31小虾米

我一直在关注一些关于使用他们的云 SQL 和 django 设置 google app engine (GAE) 的教程。我得出的结论是,它们中的大多数都会让您安装 python 和所有库的本地副本。有些甚至没有提及他们假设您将使用本地 SQL 服务器进行测试/开发。

首先,您在本地安装的 python 模块不会神奇地上传到 GAE。您可以使用现有的 GAE 库,也可以将所有代码放入项目中以进行上传。

其次,GAE 在本地安装所有可用的库,因此您可以使用它们进行开发。所以你不应该自己去获取(潜在的版本/插件冲突问题)。

我建立了一个非常简单的项目。我还没有费心去安装本地 SQL 服务器。我在 Windows 上 (aaaargh) aargh。我正处于想要 python manage.py syncdb 的阶段。在 settings.py 中,DATABASE 必须包含连接信息/url 内容。据我了解,这可以用于带有 mysql 位的本地数据库(即您自己的开发或部署后的云)或设置为使用 rdbms 从您的本地副本连接到云(不管是什么)。所以我设置了 'ENGINE': 'google.appengine.ext.django.backends.rdbms' 现在出现了这个错误:

  Error was: No module named google.appengine.ext.django.backends.rdbms.base 

我已经卸载了我的本地 django 副本并设置了我的 PYTHONPATH=C:\Program Files (x86)\Google\google_appengine\lib\django-1.5。如果没有这个集合,我会得到一个错误,所以我必须假设它使用的是 GAE 的 django。我也找到了 C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\django\backends\rdbms 路径,这听起来很相关。所以我不确定下一步该怎么做。我假设这个 rdbms 东西是与 SQL 数据库远程通信所必需的。我希望能够在本地/不在生产环境中进行测试。

我的配置中有什么问题会导致这种情况?

附带说明一下,每当我尝试使用 GAE 启动器启动服务器时,我都会得到 ImportError: Could not import settings 'myblog.settings' (Is it on sys.path?): No module名为 appengine_toolkit。 python manage.py runserver 工作正常,直到请求触发连接到 SQL 服务器的尝试。

请您参考如下方法:

我在这里缺少的主要内容是确保 python 可以看到 GAE 库。我在 Linux 中解决了这个问题:

export PYTHONPATH=/usr/local/google_appengine/:/usr/local/google_appengine/lib/:/usr/local/google_appengine/lib/django-1.5/ 

那是

  • google_appengine/
  • google_appengine/lib/
  • google_appengine/lib/django-1.5/

PYTHONPATH 只是不能在 Windows 上运行。关于 Could not import settings 'myblog.settings',这只发生在 Windows 上,我不明白为什么,真的不想浪费我的时间。

真正帮助我使用 GAE 的两件事是:

  1. 对预期的(但隐含的)GAE 有一些了解 project structure .
  2. 掌握 virtualenv(我发现 this 是一个不错的介绍),并迅速意识到 google app engine 的启动器在沙盒和您要使用的外部库方面有多么困惑。

最终,我的设置如下。我使用 virtualenv 将所有包安装到本地 env 目录。为了在本地测试,这工作正常(使用上面的 PYTHONPATH)。为了仅部署正确的包(例如推送 django-wiki 而不是 MySQLdb),我创建了一个 libs 目录并将我想要的所有内容链接到 env/lib/python2.7/site-packages/.

作为 PYTHONPATH 的更好替代品,类似这样的东西(在 settings.py 中):

IS_PRODUCTION = os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine') 
 
if IS_PRODUCTION: 
    sys.path.insert(0, 'libs') 
else: 
    sys.path.insert(0, 'env/lib/python2.7/site-packages/') 

我还在 app.yaml 中添加了一个 skip_files: 部分以排除 #- ^env/.* 并在部署时取消注释.如果我像其他人提到的那样将我的 env 放在项目目录之外,这可能就没有必要了。