Code Quality Rank: L4
Programming language: Swift
License: MIT License
Tags: Data Management     SQL Drivers    
Latest version: v0.9.4

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.

Do you think we are missing an alternative of MySQL Swift or a related project?

Add another 'SQL drivers' Library



Platform Linux, macOS CircleCI

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


  • Swift 5.0 or later
  • MariaDB or MySQL Connector/C (libmysqlclient) 2.2.3 or later


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


$ sudo apt-get install libmariadbclient-dev


Swift Package Manager

  • Add mysql-swift to Package.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: [
            name: "YourAppOrLibrary",
            dependencies: [
                // add a dependency


Connection & Querying

  1. Create a pool with options (hostname, port, password,...).
  2. 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


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



*Note that all licence references and agreements mentioned in the MySQL Swift README section above are relevant to that project's source code only.