是否可以在 Fluent with PostgreSQL 中使用不同的模式?

Is it possible to work with different schemas in Fluent with PostgreSQL?

我需要为不同的用户创建具有不同数量字段的 table。我想为每个用户创建一个模式,并在其中创建一组自定义的 table。我可以通过直接数据库查询来做到这一点。这将在具有给定名称的架构中创建 categories table。例如:

    func create(in schema: String, on db: Database) async throws {
        let query: SQLQueryString = """
        CREATE TABLE IF NOT EXISTS \(raw: schema).categories (
            id      uuid PRIMARY KEY,
            name    text NOT NULL,
            ...
        );
        """
        if let sql = db as? SQLDatabase {
            try await sql.raw(query).run()
        }
    }

但我想用 Fluent 来做这件事。 (my_schema 架构及其必要的权限先前已在数据库中创建)但是以下代码在 public 架构中创建了 "my_schema.categories" table:

    func create(in schema: String, on db: Database) async throws {
        try await db.schema("\(schema).categories")
            .id()
            .field("name", .string, .required)
            ...
            .create()
    }

是否可以在 Fluent 中使用不同的模式以及如何从不同的模式查询 tables?我将不胜感激。

希望我正确理解了您的具体要求。如果是这样,使用多个模式非常简单。

(1) 首先在您的配置中定义您的架构连接,确保指定 DatabaseID 和默认值:

app.databases.use(.postgres(connection_info), as: .psql, isDefault: true)
app.databases.use(.postgres(connection_info), as: .otherDB, isDefault: false)

(2) 运行 您的创建 table 迁移指定要将 table 添加到的数据库架构:

app.migrations.add(MigrateCategories())
app.migrations.add(MigrateSomeOtherTable(), to: .otherDB)

(3) 从不同的数据库模式中查询 tables:

categories.create(on: req.db())
someOtherTable.create(on: req.db(.otherDB))

现在你有两个数据库

  1. .psql 是默认的并且有一个 table 称为类别
  2. .otherDB 有一个 table 叫做 someOtherTable

使用数据库 ID 指示您要在何处创建新 table 以及要在何处进行 运行 查询。

是的,这是最近引入到 Fluent 中的。更新到最新版本,然后您可以在您的模型上添加一个新的静态 属性:

final class MyModel: Model {
  static let schema = "table_name"
  static let space = "schema_name"
  // ...
}

有关详细信息,请参阅 the docs