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


More than 1 year has passed since last update.

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

基本的に公式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を参照している箇所もコメントアウトか削除をしていきます。

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

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

// swift-tools-version:4.0
import PackageDescription

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

        // 🔵 Swift ORM (queries, models, relations, etc) built on SQLite 3.
        .package(url: "", from: "3.0.0"),

        // 🔵 Swift ORM (queries, models, relations, etc) built on MySQL
        .package(url: "", from: "3.0.0"),
        .package(url: "", 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を使う設定を記述します。

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

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

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

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

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のバージョンを取得できます。


最後に Package.swift からSQLite関係のパッケージを削除します。

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