当前位置: 首页 > 知识库问答 >
问题:

在多租户应用中动态设置Flask-SQLAlChemy数据库连接

梁丘霖
2023-03-14

我有一个多租户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/db1mysql://username:password@Z.Z.Z.Z/db1(或任何其他任意MySQL URI),具体取决于发出请求的客户端。

我发现了一些类似的问题(见下文),但是我还没有想出一个明确的方法来实现它,特别是在使用烧瓶-SQLAlChemy扩展时。

使用sqlalchemy,如何基于每个请求动态绑定到数据库引擎

烧瓶SQLAlChemy设置动态URI

我还看到了一些用于处理分片数据库的示例(这也应该适用,因为数据库基本上是由客户机逻辑分片的),但是,同样,没有特定于SQLAlchemy的内容。

如果有意义的话,我也愿意直接使用SQLAlchemy,而不使用Flask SQLAlchemy扩展。我是SQLAlchemy的新手-任何帮助都将不胜感激!

编辑:能够从数据库中反映表模式将是一个额外的好处。

共有3个答案

钱哲茂
2023-03-14

您需要使用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的补充。而您可以在用户登录方法上动态绑定其他数据库。

希望这是有帮助的!

全誉
2023-03-14

你可以这样做。仅供参考,这是纯炼金术,不是烧瓶炼金术。希望你需要这个只读的东西。你可以想出一些其他需要编写的东西,比如会话/模型上的侦听器

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()
麹培
2023-03-14

如果您使用的是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相关的每个数据库,我可以依赖?