1

我们当前的设置将 Django 托管在 Google 的 appengine 上,并在 Google 的 Cloud SQL 上使用 MySQL 数据库。

用户(客户)通常是我们为多租户数据库结构(每个客户一个数据库)提供子域的小型企业。

至于确定哪个请求应该访问哪个数据库,有一个现有的中间件可以剥离请求路径以获取子域,从而返回 settings.py 中定义的相关数据库别名

from django.conf import settings
import threading
currentCompanyConnection = threading.local()

class DatabaseMiddleware(object): 
    def process_request(self, request): 
        url = request.build_absolute_uri()
        if url.find("http://") < 0:
            company = url.split("https://")[1].split(".")[0]
        else:
            company = url.split("http://")[1].split(".")[0]
        global currentCompanyConnection
        if company in settings.DATABASES:
            currentCompanyConnection.company = company
        else:
            currentCompanyConnection.company = 'default'
        request.currentCompany = str(currentCompanyConnection.company)
        return None

class DBRouter(object): 

    def read_and_write(self, model, **hints): 
        return currentCompanyConnection.company

    db_for_read  = read_and_write 
    db_for_write = read_and_write

然而,为了让我们的 Web 应用程序具有免费增值自助服务的功能,必须动态生成一个新数据库,并为每个注册的用户动态地导入到 Django 的 settings.py 中。

最后一部分是我似乎无法弄清楚的,因为每次我更改 settings.py 时,我都必须再次将其部署到 appengine。除此之外,我不确定如何通过我们的网络应用程序在 Google 的 Cloud SQL 中创建一个带有预定义表的新数据库。

谢谢你的帮助!我喜欢解决工作中的挑战,但这是我以前从未做过的事情=O

4

1 回答 1

1

一旦部署,您将无法修改源文件。您可以修改 blobstore 或数据存储中的内容。

我建议将设置作为结构化数据存储在数据存储中,然后让您的 settings.py 从数据存储中读取数据并将它们作为 python 对象存储在 settings.py 中,这些对象可以从其他代码访问。这应该允许您配置 django 以连接到多个数据库。

我对 CloudSQL 不太熟悉,但我认为您可能仍然面临启动多个 CloudSQL 实例并将适当的流量路由到适当的实例的挑战。

于 2013-03-22T03:05:59.417 回答