その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
を参照している箇所もコメントアウトか削除をしていきます。
// 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 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: "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を使う設定を記述します。
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のバージョンを取得するクエリを記述します。
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関係のパッケージを削除します。
次回はカラムから情報を取得するところをやっていこうと思います。