Можно ли работать с разными схемами во Fluent с 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 и необходимые права на нее были предварительно созданы в базе данных) Но следующий код создает таблицу "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 и как запрашивать таблицы из разных схем? Буду признателен за любые идеи.

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Надеюсь, я правильно понял ваш запрос. Если да, то использовать несколько схем довольно просто.

(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))

Теперь у вас есть две базы данных

  1. .psql используется по умолчанию и имеет одну таблицу с категориями.
  2. .otherDB имеет одну таблицу с именем someOtherTable

Используйте DatabaseID, чтобы указать, где вы хотите создавать новые таблицы и где вы хотите выполнять запросы.

Спасибо за ответ. Мне тоже было непонятно использование нескольких баз данных в Fluent. Но под термином «схема» я подразумеваю схему, используемую postgres, которые создают свои собственные пространства имен в той же базе данных.

Victor 29.04.2022 18:42
Ответ принят как подходящий

Да, это было недавно представлено во Fluent. Обновите до последней версии, а затем вы можете добавить новое статическое свойство в свою модель:

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

Дополнительные сведения см. в статье документы.

Большое спасибо за вашу работу над Fluent и Vapor. Это значительное улучшение гибкости построения базы данных.

Victor 13.05.2022 12:48

Другие вопросы по теме