我有一个多租户Flask Web应用程序,它与1个主MySQL数据库(用于查找客户端信息)和几十个客户端MySQL数据库(都具有相同的模式)接口。
我目前正尝试使用SQLAlchemy和Flask SQLAlchemy扩展与数据库接口,但我正在努力找到一种方法,允许我在应用程序中定义的模型根据客户机的不同,动态地将上下文从一个客户机数据库切换到另一个客户机数据库。
在Flask-SQLAlChemy网站上,一个简单的示例如下所示:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@Y.Y.Y.Y/db1'
db = SQLAlchemy(app)
class User(db.Model):
# Etc.
唯一的问题是,SQLALCHEMY\u DATABASE\u URI
配置是静态完成的。我可能需要在mysql://username:password@Y.Y.Y.Y/db1
和mysql://username:password@Z.Z.Z.Z/db1
(或任何其他任意MySQL URI),具体取决于发出请求的客户端。
我发现了一些类似的问题(见下文),但是我还没有想出一个明确的方法来实现它,特别是在使用烧瓶-SQLAlChemy扩展时。
使用sqlalchemy,如何基于每个请求动态绑定到数据库引擎
烧瓶SQLAlChemy设置动态URI
我还看到了一些用于处理分片数据库的示例(这也应该适用,因为数据库基本上是由客户机逻辑分片的),但是,同样,没有特定于SQLAlchemy的内容。
如果有意义的话,我也愿意直接使用SQLAlchemy,而不使用Flask SQLAlchemy扩展。我是SQLAlchemy的新手-任何帮助都将不胜感激!
编辑:能够从数据库中反映表模式将是一个额外的好处。
您需要使用SQLALCHEMY_BINDS方法绑定到mult[le客户机数据库。
app.config['SQLALCHEMY_BINDS'] = { 'user1': mysql database', user2: mysqal2database'}
您还需要在模型中引用bind_key名称,例如"user1":
class users(db.Model):
__bind_key__
id = db.Column(Integer, primary_key=True)
name = db.Column(String)
以上这些方法是对您应该设置的主要SQLALCHEMY_数据库_URI的补充。而您可以在用户登录方法上动态绑定其他数据库。
希望这是有帮助的!
你可以这样做。仅供参考,这是纯炼金术,不是烧瓶炼金术。希望你需要这个只读的东西。你可以想出一些其他需要编写的东西,比如会话/模型上的侦听器
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# an Engine, which the Session will use for connection
# resources
some_engine_1 = create_engine('postgresql://scott:tiger@localhost/')
some_engine_2 = create_engine('postgresql://adriel:velazquez@localhost/')
# create a configured "Session" class
Session_1 = sessionmaker(bind=some_engine_1)
Session_2 = sessionmaker(bind=some_engine_2)
# create a Session
session_1 = Session_1()
session_2 = Session_2()
Base = declarative_base()
class ModelBase(Base):
#different custom queries for each database
master_query = session_1.query_property()
client_1_query = session_2.query_property()
class User(ModelBase):
pass
#ETC
##Accessing the different databases:
User.master_query.filter(User.id == 1).all()
User.client_1_query.filter(User.id == 1).all()
如果您使用的是flask sqlalchemy 0.12或更高版本,则绑定支持此功能。
SQLALCHEMY_DATABASE_URI = 'postgres://localhost/main'
SQLALCHEMY_BINDS = {
'users': 'mysqldb://localhost/users',
'appmeta': 'sqlite:////path/to/appmeta.db'
}
您可以在模型定义中指定连接数据库。
class User(db.Model):
__bind_key__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
它将使用mysqldb auto。有关更多详细信息,请参阅官方文件。具有绑定的多个数据库
问题内容: 我有一个使用Flask-SQLAlchemy的Flask应用程序,我正在尝试将其配置为使用Flask-Restless软件包使用多个数据库。 根据文档,配置模型以使用多个数据库似乎非常简单。 但是,它似乎不适用于我。 我创建我的应用程序并初始化数据库,如下所示: 然后定义包括在内的模型,这些模型应该告诉SQLAlchemy它需要使用哪个数据库: 然后我像这样启动Flask-Restle
问题内容: 让我们说我需要设计一个数据库,该数据库将托管多个公司的数据。现在出于安全和管理目的,我需要确保正确隔离了不同公司的数据,但我也不想启动10个mysql进程来在10个不同的服务器上托管10个公司的数据。使用mysql数据库执行此操作的最佳方法是什么。 问题答案: 多租户数据库有几种方法。为了进行讨论,它们通常分为三类。 每个租户一个数据库。 共享数据库,每个租户一个模式。 共享数据库,共
我正在将当前的应用程序迁移到多租户体系结构。由于只有一个代码库,我需要解决多个租户的问题。我使用的是单数据库、多模式的方法。每个租户将被分配一个单独的模式,其中元数据保存在默认模式中。 应用程序是用ASP构建的。NET MVC。我使用Dapper连接到我的SQL Server。我有50个函数,使用直接查询和存储过程调用数据库。当为每个租户初始化dapper时,是否有任何方法可以在不改变函数的情况下
我目前正试图找出为我的系统设置多租户的最佳方法。我面临的问题是,租户并不总是必须是子域,但可以作为子域的一部分进行设置,子域可以有多个租户。我似乎在网上找不到任何东西可以帮助我在Laravel 6中进行设置。 系统要求: 一台服务器可以有许多子域 系统必须设置一个数据库,该数据库将使用tenant_id来确定哪些数据属于租户。 我目前正在以以下结构将所有子域数据存储在“subdomains”表中:
我们正在开发一个多租户应用程序。在体系结构方面,我们为业务逻辑设计了共享中间层,为数据持久性设计了每个租户一个数据库。也就是说,业务层将与每个租户的数据库服务器建立一组连接(连接池)。这意味着应用程序为每个租户维护单独的连接池。如果我们预计约有5000个租户,那么这个解决方案需要高资源利用率(每个租户的应用服务器和数据库服务器之间的连接),这会导致性能问题。 我们已经通过保持公共连接池解决了这个问
我有一个多租户数据库。共享数据库有一个租户配置表,该表保存所有租户信息 每个租户数据库都有一个插入触发器,该触发器将新记录插入到将租户id附加到该记录的核心数据库中。 我需要知道插入来自哪个租户数据库,以便能够根据执行该过程的数据库设置租户id。 是否有一个唯一的ID相关的每个数据库,我可以依赖?