Мне нужно создать таблицы с разным количеством полей для разных пользователей. Я хочу создать схему для каждого пользователя, а в ней собственный набор таблиц. Я могу сделать это с помощью прямых запросов к базе данных. Это создаст таблицу 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
и необходимые права на нее были предварительно созданы в базе данных) Но следующий код создает таблицу "my_schema.categories"
в схеме public
:
func create(in schema: String, on db: Database) async throws {
try await db.schema("\(schema).categories")
.id()
.field("name", .string, .required)
...
.create()
}
Можно ли работать с разными схемами во Fluent и как запрашивать таблицы из разных схем? Буду признателен за любые идеи.
Надеюсь, я правильно понял ваш запрос. Если да, то использовать несколько схем довольно просто.
(1) Сначала в вашей конфигурации определите соединения со схемой, обязательно указав DatabaseID и значения по умолчанию:
app.databases.use(.postgres(connection_info), as: .psql, isDefault: true)
app.databases.use(.postgres(connection_info), as: .otherDB, isDefault: false)
(2) Запустите миграцию создания таблицы, указав схему базы данных, в которую нужно добавить таблицу:
app.migrations.add(MigrateCategories())
app.migrations.add(MigrateSomeOtherTable(), to: .otherDB)
(3) Таблицы запросов из разных схем базы данных:
categories.create(on: req.db())
someOtherTable.create(on: req.db(.otherDB))
Теперь у вас есть две базы данных
Используйте DatabaseID, чтобы указать, где вы хотите создавать новые таблицы и где вы хотите выполнять запросы.
Да, это было недавно представлено во Fluent. Обновите до последней версии, а затем вы можете добавить новое статическое свойство в свою модель:
final class MyModel: Model {
static let schema = "table_name"
static let space = "schema_name"
// ...
}
Дополнительные сведения см. в статье документы.
Большое спасибо за вашу работу над Fluent и Vapor. Это значительное улучшение гибкости построения базы данных.
Спасибо за ответ. Мне тоже было непонятно использование нескольких баз данных в Fluent. Но под термином «схема» я подразумеваю схему, используемую postgres, которые создают свои собственные пространства имен в той же базе данных.