我们当前的设置将 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