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

その２はこちら　 [VaporとMySQLを接続する。その2](https://qiita.com/takoikatakotako/items/0dcc25748a099c768f37)

VaporでMySQLに接続する方法です。
基本的に公式[Vapor Docs　MySQL](https://docs.vapor.codes/3.0/mysql/getting-started/) に書いてある内容です。
まず最初にプロジェクトを作成します。

```bash
$ 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`を参照している箇所もコメントアウトか削除をしていきます。

```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)
```

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

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

```swift: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`のパッケージを以下のコマンドで追加します。

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

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

```swift: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のバージョンを取得するクエリを記述します。

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