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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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

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