🐬 Non-blocking, event-driven Swift client for MySQL.
The table below shows a list of MySQLKit major releases alongside their compatible NIO and Swift versions.
Version | NIO | Swift | SPM |
---|---|---|---|
4.0 | 2.0 | 5.2+ | from: "4.0.0" |
3.0 | 1.0 | 4.0+ | from: "3.0.0" |
2.0 | N/A | 3.1+ | from: "2.0.0" |
1.0 | N/A | 3.1+ | from: "1.0.0" |
Use the SPM string to easily include the dependency in your Package.swift
file.
.package(url: "https://github.com/vapor/mysql-kit.git", from: ...)
MySQLKit supports the following platforms:
- Ubuntu 16.04+
- macOS 10.15+
MySQLKit is a MySQL client library built on SQLKit. It supports building and serializing MySQL-dialect SQL queries. MySQLKit uses MySQLNIO to connect and communicate with the database server asynchronously. AsyncKit is used to provide connection pooling.
Database connection options and credentials are specified using a MySQLConfiguration
struct.
import MySQLKit
let configuration = MySQLConfiguration(
hostname: "localhost",
port: 3306,
username: "vapor_username",
password: "vapor_password",
database: "vapor_database"
)
URL string based configuration is also supported.
guard let configuration = MySQLConfiguration(url: "mysql://...") else {
...
}
To connect via unix-domain sockets, use unixDomainSocketPath
instead of hostname
and port
.
let configuration = MySQLConfiguration(
unixDomainSocketPath: "/path/to/socket",
username: "vapor_username",
password: "vapor_password",
database: "vapor_database"
)
Once you have a MySQLConfiguration
, you can use it to create a connection source and pool.
let eventLoopGroup: EventLoopGroup = ...
defer { try! eventLoopGroup.syncShutdown() }
let pools = EventLoopGroupConnectionPool(
source: MySQLConnectionSource(configuration: configuration),
on: eventLoopGroup
)
defer { pools.shutdown() }
First create a MySQLConnectionSource
using the configuration struct. This type is responsible for creating new connections to your database server as needed.
Next, use the connection source to create an EventLoopGroupConnectionPool
. You will also need to pass an EventLoopGroup
. For more information on creating an EventLoopGroup
, visit SwiftNIO's documentation. Make sure to shutdown the connection pool before it deinitializes.
EventLoopGroupConnectionPool
is a collection of pools for each event loop. When using EventLoopGroupConnectionPool
directly, random event loops will be chosen as needed.
pools.withConnection { conn
print(conn) // MySQLConnection on randomly chosen event loop
}
To get a pool for a specific event loop, use pool(for:)
. This returns an EventLoopConnectionPool
.
let eventLoop: EventLoop = ...
let pool = pools.pool(for: eventLoop)
pool.withConnection { conn
print(conn) // MySQLConnection on eventLoop
}
Both EventLoopGroupConnectionPool
and EventLoopConnectionPool
can be used to create instances of MySQLDatabase
.
let mysql = pool.database(logger: ...) // MySQLDatabase
let rows = try mysql.simpleQuery("SELECT @@version;").wait()
Visit MySQLNIO's docs for more information on using MySQLDatabase
.
A MySQLDatabase
can be used to create an instance of SQLDatabase
.
let sql = mysql.sql() // SQLDatabase
let planets = try sql.select().column("*").from("planets").all().wait()
Visit SQLKit's docs for more information on using SQLDatabase
.