MySQL Swift alternatives and similar libraries
Based on the "SQL drivers" category.
Alternatively, view MySQL Swift alternatives based on common mentions on social networks and blogs.
-
Perfect-MySQL
A stand-alone Swift wrapper around the MySQL client library, enabling access to MySQL servers. -
Perfect-PostgreSQL
A stand-alone Swift wrapper around the libpq client library, enabling access to PostgreSQL servers.
InfluxDB high-performance time series database

* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of MySQL Swift or a related project?
README
mysql-swift
MySQL client library for Swift. This is inspired by Node.js' mysql.
- Based on libmysqlclient
- Raw SQL query
- Simple query formatting and escaping (same as Node's)
- Mapping queried results to
Codable
structs or classes
Note: No asynchronous I/O support currently. It depends libmysqlclient.
// Declare a model
struct User: Codable, QueryParameter {
let id: Int
let userName: String
let age: Int?
let status: Status
let createdAt: Date
enum Status: String, Codable {
case created = "created"
case verified = "verified"
}
private enum CodingKeys: String, CodingKey {
case id
case userName = "user_name"
case age
case status = "status"
case createdAt = "created_at"
}
}
// Selecting
let nameParam = "some one"
let ids: [QueryParameter] = [1, 2, 3, 4, 5, 6]
let optionalInt: Int? = nil
let rows: [User] = try conn.query("SELECT id,user_name,status,status,created_at FROM `user` WHERE (age > ? OR age is ?) OR name = ? OR id IN (?)", [50, optionalInt, nameParam, QueryArray(ids)] ])
// Inserting
let age: Int? = 26
let user = User(id: 0, userName: "novi", age: age, status: .created, createdAt: Date())
let status = try conn.query("INSERT INTO `user` SET ?", [user]) as QueryStatus
let newId = status.insertedId
// Updating
let tableName = "user"
let defaultAge = 30
try conn.query("UPDATE ?? SET age = ? WHERE age is NULL;", [tableName, defaultAge])
Requirements
- Swift 5.0 or later
- MariaDB or MySQL Connector/C (libmysqlclient) 2.2.3 or later
macOS
Install pkg-config .pc
file in cmysql or cmysql-mariadb.
# cmysql
$ brew tap novi/tap
$ brew install novi/tap/cmysql
# cmysql-mariadb
$ brew tap novi/tap
$ brew install novi/tap/cmysqlmariadb
Ubuntu
- Install
libmariadbclient
- Follow Setting up MariaDB Repositories and set up your repository.
$ sudo apt-get install libmariadbclient-dev
Installation
Swift Package Manager
- Add
mysql-swift
toPackage.swift
of your project.
// swift-tools-version:5.0
import PackageDescription
let package = Package(
...,
dependencies: [
.package(url: "https://github.com/novi/mysql-swift.git", .upToNextMajor(from: "0.9.0"))
],
targets: [
.target(
name: "YourAppOrLibrary",
dependencies: [
// add a dependency
"MySQL",
]
)
]
)
Usage
Connection & Querying
- Create a pool with options (hostname, port, password,...).
- Use
ConnectionPool.execute()
. It automatically get and release a connection.
let option = Option(host: "your.mysql.host"...) // Define and create your option type
let pool = ConnectionPool(option: option) // Create a pool with the option
let rows: [User] = try pool.execute { conn in
// The connection `conn` is held in this block
try conn.query("SELECT * FROM users;") // And it returns result to outside execute block
}
Transaction
let wholeStaus: QueryStatus = try pool.transaction { conn in
let status = try conn.query("INSERT INTO users SET ?;", [user]) as QueryStatus // Create a user
let userId = status.insertedId // the user's id
try conn.query("UPDATE info SET some_value = ? WHERE some_key = 'latest_user_id' ", [userId]) // Store user's id that we have created the above
}
wholeStaus.affectedRows == 1 // true
License
MIT
*Note that all licence references and agreements mentioned in the MySQL Swift README section above
are relevant to that project's source code only.