Help us understand the problem. What is going on with this article?

VaporとMySQLを接続する。その1

More than 1 year has passed since last update.

その2はこちら  VaporとMySQLを接続する。その2

VaporでMySQLに接続する方法です。
基本的に公式Vapor Docs MySQL に書いてある内容です。
まず最初にプロジェクトを作成します。

$ vapor new mysqlTest
$ cd mysqlTest
$ vapor -y xcode  // 必要あれば
$ vapor build
$ vapor run

localhost:8080 にブラウザからアクセスし、Vaporが起動していることを確認してください。
APIモードでプロジェクトを作成しているので、 It works! と表示されているはずです。

次に TodoController.swift と Todo.swift を削除します。
Xcodeから消すときは MoveToTrash を選択し、ファイルを残さないでください。
TodoController.swift と Todo.swiftを参照している箇所もコメントアウトか削除をしていきます。

routes.swift
// Example of configuring a controller
// let todoController = TodoController()
// router.get("todos", use: todoController.index)
// router.post("todos", use: todoController.create)
// router.delete("todos", Todo.parameter, use: todoController.delete)
configure.swift
/// Configure migrations
// var migrations = MigrationConfig()
// migrations.add(model: Todo.self, database: .sqlite)
// services.register(migrations)

Package.swift を編集し、 FluentMySQL と MySQL のパッケージを追加します。

Package.swift
// swift-tools-version:4.0
import PackageDescription

let package = Package(
    name: "mysqlTest",
    dependencies: [
        // 💧 A server-side Swift web framework.
        .package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"),

        // 🔵 Swift ORM (queries, models, relations, etc) built on SQLite 3.
        .package(url: "https://github.com/vapor/fluent-sqlite.git", from: "3.0.0"),

        // 🔵 Swift ORM (queries, models, relations, etc) built on MySQL
        .package(url: "https://github.com/vapor/mysql.git", from: "3.0.0"),
        .package(url: "https://github.com/vapor/fluent-mysql.git", from: "3.0.0")
    ],
    targets: [
        .target(name: "App", dependencies: ["FluentMySQL", "MySQL", "FluentSQLite", "Vapor"]),
        .target(name: "Run", dependencies: ["App"]),
        .testTarget(name: "AppTests", dependencies: ["App"])
    ]
)

Package.swift を編集したら、 FluentMySQL と MySQLのパッケージを以下のコマンドで追加します。

$ swift build
$ vapor -y xcode  // SwiftBuildした後は必要

configure.swift を編集し、SQLiteでは無く、MySQLを使う設定を記述します。

configure.swift
import MySQL
import FluentMySQL
import Vapor

/// Called before your application initializes.
public func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services) throws {
    /// Register providers first
    try services.register(MySQLProvider())

    /// Register routes to the router
    let router = EngineRouter.default()
    try routes(router)
    services.register(router, as: Router.self)

    /// Register middleware
    var middlewares = MiddlewareConfig() // Create _empty_ middleware config
    /// middlewares.use(FileMiddleware.self) // Serves files from `Public/` directory
    middlewares.use(ErrorMiddleware.self) // Catches errors and converts to HTTP response
    services.register(middlewares)

    // Configure a MySQL database
    let mysql = MySQLDatabase(config: MySQLDatabaseConfig(
        hostname: "MYSQLサーバーのuri",
        port: 3306,
        username: "ユーザー名",
        password: "パスワード",
        database: "データベース名"))

    /// Register the configured MySQL database to the database config.
    var databases = DatabasesConfig()
    databases.add(database: mysql, as: .mysql)
    services.register(databases)

    /// Configure migrations
    //var migrations = MigrationConfig()
    //migrations.add(model: Todo.self, database: .sqlite)
    //services.register(migrations)
}

routes.swift にMySQLのバージョンを取得するクエリを記述します。

routes.swift
struct MySQLVersion: Codable {
    let version: String
}

router.get("sql") { req in
    return req.withPooledConnection(to: .mysql) { conn in
        return conn.raw("SELECT @@version as version")
            .all(decoding: MySQLVersion.self)
        }.map { rows in
            return rows[0].version
    }
}

ブラウザから http://localhost:8080/sqlにアクセスするとMySQLのバージョンを取得できます。
ConohaのDBサーバー(MySQ互換のMariaDB)に接続しています。

10.0.19-MariaDB-log

最後に Package.swift からSQLite関係のパッケージを削除します。
次回はカラムから情報を取得するところをやっていこうと思います。

takoikatakotako
インフラをやったりアプリを作ったりしています。
http://swiswiswift.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away