Работа с базами данных в Swift: PostgreSQL и MongoDB для начинающих

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Почему Swift и базы данных?

Swift — это не только язык для создания мобильных приложений. Благодаря фреймворкам Vapor и SwiftNIO, разработчики могут создавать полноценные серверные приложения, которые взаимодействуют с реляционными и документо-ориентированными базами данных. В этой статье мы разберем, как подключиться к PostgreSQL и MongoDB из Swift, и покажем простые примеры кода для начинающих.

Статья ориентирована на тех, кто уже знаком с основами Swift, но только начинает осваивать работу с базами данных. Мы рассмотрим два популярных подхода: классический SQL (PostgreSQL) и гибкий NoSQL (MongoDB).

1. PostgreSQL в Swift: Структурированные данные

PostgreSQL — это мощная реляционная база данных с открытым исходным кодом. Для работы с ней в Swift мы будем использовать пакет PostgresKit, который входит в экосистему Vapor.

1.1 Установка и настройка

Добавьте зависимость в файл Package.swift:

// swift-tools-version:5.7
import PackageDescription

let package = Package(
    name: "MyApp",
    dependencies: [
        .package(url: "https://github.com/vapor/postgres-kit.git", from: "2.0.0")
    ],
    targets: [
        .executableTarget(
            name: "MyApp",
            dependencies: [
                .product(name: "PostgresKit", package: "postgres-kit")
            ]
        )
    ]
)

1.2 Подключение к базе данных

Создайте экземпляр конфигурации и подключитесь к серверу PostgreSQL:

import PostgresKit

let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
defer { try! eventLoopGroup.syncShutdown() }

let configuration = PostgresConfiguration(
    hostname: "localhost",
    port: 5432,
    username: "swift_user",
    password: "secret",
    database: "swift_db"
)

let pool = EventLoopGroupConnectionPool(
    source: PostgresConnectionSource(configuration: configuration),
    on: eventLoopGroup
)
defer { try! pool.syncShutdown() }

let connection = try pool.requestConnection().wait()
print("Подключение к PostgreSQL установлено!")

1.3 Выполнение SQL-запросов

Теперь выполним простой запрос на создание таблицы и вставку данных:

// Создаем таблицу пользователей
try connection.query("""
    CREATE TABLE IF NOT EXISTS users (
        id SERIAL PRIMARY KEY,
        name TEXT NOT NULL,
        email TEXT UNIQUE NOT NULL
    )
""").wait()

// Вставляем данные
try connection.query("""
    INSERT INTO users (name, email) 
    VALUES ('Алексей', 'alex@example.com')
""").wait()

// Читаем данные
let rows = try connection.query("SELECT * FROM users").wait()
for row in rows {
    let id = try row.decode(Int.self, column: "id")
    let name = try row.decode(String.self, column: "name")
    let email = try row.decode(String.self, column: "email")
    print("Пользователь: \(name) (\(email)), ID: \(id)")
}

2. MongoDB в Swift: Гибкие документы

MongoDB — это NoSQL база данных, которая хранит данные в формате JSON-подобных документов. Для Swift существует несколько драйверов, но мы используем официальный MongoDB Swift Driver.

2.1 Установка драйвера

Добавьте пакет в Package.swift:

dependencies: [
    .package(url: "https://github.com/mongodb/mongo-swift-driver.git", from: "1.0.0")
],
targets: [
    .executableTarget(
        name: "MyApp",
        dependencies: [
            .product(name: "MongoSwift", package: "mongo-swift-driver")
        ]
    )
]

2.2 Подключение к MongoDB

Создайте клиент и выберите базу данных:

import MongoSwift

let client = try MongoClient("mongodb://localhost:27017")
defer { try? client.syncClose() }

let database = client.db("swift_mongo_db")
let collection = database.collection("users")
print("Подключение к MongoDB установлено!")

2.3 CRUD операции с документами

MongoDB использует BSON-документы. Вот примеры основных операций:

// Создаем документ (вставка)
let newUser: Document = ["name": "Мария", "email": "maria@example.com", "age": 28]
let insertResult = try collection.insertOne(newUser).wait()
print("Вставлен документ с ID: \(insertResult?.insertedID ?? "неизвестно")")

// Поиск документов
let cursor = try collection.find(["age": ["$gte": 18]]).wait()
for try await doc in cursor {
    print("Найден пользователь: \(doc["name"] ?? "нет имени")")
}

// Обновление документа
try collection.updateOne(
    filter: ["email": "maria@example.com"],
    update: ["$set": ["age": 29]]
).wait()

// Удаление
try collection.deleteOne(["name": "Мария"]).wait()

3. Сравнение PostgreSQL и MongoDB в Swift

Выбор между реляционной и документной БД зависит от структуры ваших данных.

  • PostgreSQL — идеален для строгих схем, сложных связей между таблицами и транзакций ACID. Подходит для финансовых систем, интернет-магазинов.
  • MongoDB — лучше для быстрого прототипирования, неструктурированных данных и проектов, где схема часто меняется. Хорошо подходит для блогов, систем аналитики и IoT.

В Swift оба драйвера работают асинхронно через EventLoopFuture или async/await, что позволяет эффективно обрабатывать множество запросов без блокировки потоков.

4. Рекомендации для начинающих

Вот несколько советов, которые помогут избежать типичных ошибок:

  1. Используйте пулы соединений. Никогда не открывайте новое соединение на каждый запрос — это медленно и расточительно.
  2. Экранируйте данные. Всегда используйте параметризованные запросы (как в примерах выше), чтобы избежать SQL-инъекций.
  3. Тестируйте локально. Установите Docker-образы PostgreSQL и MongoDB для разработки: docker run postgres и docker run mongo.
  4. Изучайте SwiftNIO. Понимание основ асинхронного программирования в Swift значительно упростит работу с базами данных

Блоги

Рекомендаций по книгам