是否可以使用不同的模式在流利与PostgreSQL工作?



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

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"表:

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

是否有可能在Fluent中使用不同的模式以及如何从不同的模式查询表?如有任何建议,我将不胜感激。

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

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

详情请参阅文档

希望我能正确理解你的确切要求。如果是这样,使用多个模式非常简单。

(1)首先在配置中定义模式连接,确保指定DatabaseID和默认值:

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

(2)运行create table迁移,指定要添加表的数据库模式:

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

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

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

现在你有两个数据库

  1. 。psql是默认的,它有一个名为categories
  2. 的表。
  3. 。otherDB有一个名为someOtherTable
  4. 的表

使用DatabaseID来指示要在哪里创建新表以及要在哪里运行查询。

最新更新