3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VaporAdvent Calendar 2018

Day 5

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

Last updated at Posted at 2018-12-04

その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関係のパッケージを削除します。
次回はカラムから情報を取得するところをやっていこうと思います。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?