Введение: Почему 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. Рекомендации для начинающих
Вот несколько советов, которые помогут избежать типичных ошибок:
- Используйте пулы соединений. Никогда не открывайте новое соединение на каждый запрос — это медленно и расточительно.
- Экранируйте данные. Всегда используйте параметризованные запросы (как в примерах выше), чтобы избежать SQL-инъекций.
- Тестируйте локально. Установите Docker-образы PostgreSQL и MongoDB для разработки:
docker run postgresиdocker run mongo. - Изучайте SwiftNIO. Понимание основ асинхронного программирования в Swift значительно упростит работу с базами данных