【问题标题】:Vapor 3: Using multiple databasesVapor 3:使用多个数据库
【发布时间】:2019-07-24 22:12:34
【问题描述】:

使用 Vapor 3,是否有一种简单的方法可以在服务器运行时切换数据库?

例如,用户使用“登录”数据库登录。然后我设置 该用户在其 cookie 中的数据库。然后,该用户的任何后续请求都会使用 cookie 中标识的数据库(这种情况下的“用户”实际上是一家公司)。

所有数据库都来自同一个数据库系列(例如 MySQL)。 这会将每个公司的数据保存在自己的数据库中,并限制 每个数据库的大小(希望总体而言,数据库操作会更快)。 此外,任何恢复数据库的需求只会影响一家公司,而且备份会更简单。

  1. 如何做到这一点?
  2. 这会不会非常低效?

还有其他更好的方法来实现这一点吗?

【问题讨论】:

    标签: database vapor


    【解决方案1】:

    据我了解,您可以创建一些不同的数据库标识符,例如:

    extension DatabaseIdentifier {
        static var db1: DatabaseIdentifier<MySQLDatabase> {
            return .init("db1")
        }
        static var db2: DatabaseIdentifier< MySQLDatabase > {
            return .init("db2")
        }
    }
    

    然后像这样在configure.swift注册他们

    let db1 = MySQLDatabase(config: MySQLDatabaseConfig(hostname: "localhost", username: "root", database: "db1"))
    let db2 = MySQLDatabase(config: MySQLDatabaseConfig(hostname: "localhost", username: "root", database: "db2"))
    var databaseConfig = DatabasesConfig()
    databaseConfig.add(database: db1, as: .db1)
    databaseConfig.add(database: db2, as: .db2)
    services.register(databaseConfig)
    

    之后不要忘记在任何地方使用.db1.db2 标识符,而不是默认的.mysql(对于MySQL),例如在迁移中

    migrations.add(model: User.self, database: .db1)
    

    使用池连接

    return req.requestPooledConnection(to: . db1).flatMap { conn in
        defer { try? req.releasePooledConnection(conn, to: . db1) }
        return User.query(on: conn).all()
    }
    

    在交易中

    return req.transaction(on: .db1) { conn in
        return User.query(on: conn).all()
    }
    

    抱歉,如果我没有回答您的问题。我知道如果Fluent 可以支持为每个查询传递数据库名称,那就太好了,但我还没有在其中找到。 (或者如何在查询中传递数据库名称并不明显)

    但顺便说一句,从我的角度来看,为每个客户端设置单独的数据库可能会让您对迁移感到非常头疼……也许将它们全部存储在一个数据库中但使用分区会更好?例如对于像described here这样的PostgreSQL

    【讨论】:

    • 感谢您的回答。需要有单独的数据库是公司安全策略的要求,而不仅仅是为了性能。我不太了解您的交易。我设置了路由,但不清楚如何在路由中使用不同的数据库。
    • 考虑微服务架构也可能是有益的。
    • Nvm 他们都是同一个数据库家族的一部分,忽略我刚才所说的:)
    • 哦,据我了解,您的所有查询现在看起来都像 User.query(on: req)
    • 因此您可以使用自定义数据库标识符获得池连接,然后在该连接上运行查询,而不是像 User.query(on: conn)
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2019-04-08
    • 1970-01-01
    相关资源
    最近更新 更多