✎ Edit on GitHub


Drivers are what power Fluent under the hood. Fluent comes with a memory driver by default and there are many providers for databases like MySQL, SQLite, Mongo, PostgreSQL, and more available as providers.

Drivers and Providers

This graphic shows the relation between Drivers and Providers using MySQL as an example. This distinction allows Fluent to be used independently from Vapor.

If you want to use Fluent without Vapor, you will import Drivers into your package. If you are using Vapor, you will import Providers.

Search GitHub for:

Not all drivers have providers yet, and not all drivers or providers are up to date with the latest Vapor 1.0. This is a great way to contribute!

Creating a Driver

Fluent is a powerful, database agnostic package for persisting your models. It was designed from the beginning to work with both SQL and NoSQL databases alike.

Any database that conforms to Fluent.Driver will be able to power the models in Fluent and Vapor.

The protocol itself is fairly simple:

public protocol Driver {
    var idKey: String { get }
    func query<T: Entity>(_ query: Query<T>) throws -> Node
    func schema(_ schema: Schema) throws
    func raw(_ raw: String, _ values: [Node]) throws -> Node

ID Key

The ID key will be used to power functionality like User.find(). In SQL, this is often id. In MongoDB, it is _id.


This method will be called for every query made by Fluent. It is the drivers job to properly understand all of the properties on Query and return the desired rows, document, or other data as represented by Node.


The schema method will be called before the database is expected to accept queries for a schema. For some NoSQL databases like MongoDB, this can be ignored. For SQL, this is where CREATE and other such commands should be called according to Schema.


This is an optional method that can be used by any Fluent driver that accepts string queries. If your database does not accept such queries, an error can be thrown.