Tutorial: How to use PostgreSQL
In this tutorial youβll learn how to use PostgreSQL with your project β¨ π π
You can find the result of this tutorial on Github here
This tutorial is a natural follow-up of How to write Controllers. You can either go for that tutorial first and come back later or be a rebel, skip it and read on π
Index
1. Install Homebrew
2. Install PostgreSQL
3. Create and generate a new project
4. Configure your project to use PostgreSQL
5. Where to go from here
1. Install Homebrew
If you donβt have it yet I highly recommend to get it. It makes it super easy for you to install dependencies like PostgreSQL. To install Homebrew execute the following in your terminal:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
We will also install brew services. It will make it incredibly easy to start the PostgreSQL server and let it start alongside with your mac! Itβs awesome β¨!
brew tap homebrew/services
Now whenever you want to know what services are running just execute:
brew services list
2. Install PostgreSQL
Installing PostgreSQL with Homebrew is so easy, what am I even here for π?
brew install postgresql
Thatβs it. Done. Now to init postgresql just execute the following command:
initdb /usr/local/var/postgres
Next start postgresql using services with:
brew services start postgresql
See how easy brew services makes it? Postgresql now starts alongside your mac!
Now letβs create a database that we want to use in our project. To create a new database we stay in our terminal and just execute:
createdb mycooldb;
Terminal Cheatsheet:
connect to mycooldb database: psql mycooldb
within postgresql list databases: \l
within postgresql to exit server: \q
Alrighty! You are ready for step 3. Create and generate a new project π
3. Create and generate a new project
We will use the outcome of the tutorial mentioned in the beginning as a template to create our new project:
vapor new projectName --template=vaporberlin/my-first-controller
Before we generate an Xcode project we will have to replace FluentSQLite by FluentPostgreSQL and adjust the target as well as we will change the package name within Package.swift:
// swift-tools-version:4.0
import PackageDescriptionlet package = Package(
name: "projectName", // changed
dependencies: [
// π§ A server-side Swift web framework.
.package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"),
.package(url: "https://github.com/vapor/leaf.git", from: "3.0.0-rc"),
.package(url: "https://github.com/vapor/fluent-postgresql.git", from: "1.0.0-rc") // changed
],
targets: [
.target(name: "App", dependencies: ["Vapor", "Leaf", "FluentPostgreSQL"]),
.target(name: "Run", dependencies: ["App"]),
.testTarget(name: "AppTests", dependencies: ["App"]),
]
)
Now in the terminal at the root directory projectName/ execute:
vapor update -y
It may take a bit fetching the dependency, but when done you should have a project structure like this:
projectName/
βββ Package.swift
βββ Sources/
β βββ App/
β β βββ Controllers/
β β β βββ UserController.swift
β β βββ Models/
β β β βββ User.swift
β β βββ app.swift
β β βββ boot.swift
β β βββ configure.swift
β β βββ routes.swift
β βββ Run/
β βββ main.swift
βββ Tests/
βββ Resources/
βββ Public/
βββ Dependencies/
βββ Products/
Before we can run our project weβll have to configure PostgreSQL. Letβs go π
4. Configure your project to use PostgreSQL
Our first step is to change everything FluentSQLite related to our new FluentPostgreSQL and register the database information within our configure.swift:
import Vapor
import Leaf
import FluentPostgreSQL // addedpublic func configure(
_ config: inout Config,
_ env: inout Environment,
_ services: inout Services
) throws { // Register routes to the router
let router = EngineRouter.default()
try routes(router)
services.register(router, as: Router.self) try services.register(LeafProvider())
try services.register(FluentPostgreSQLProvider()) // changed config.prefer(LeafRenderer.self, for: ViewRenderer.self) let postgresqlConfig = PostgreSQLDatabaseConfig(
hostname: "127.0.0.1",
port: 5432,
username: "martinlasek",
database: "mycooldb",
password: nil
)
services.register(postgresqlConfig) var migrations = MigrationConfig()
migrations.add(model: User.self, database: .psql) // changed
services.register(migrations)
}
For me the username is martinlasek but you can find out yours by typing whoami in the terminal. The second step before we can run our project is to adjust our User model in User.swift:
import FluentPostgreSQL // changed
import Vaporfinal class User: PostgreSQLModel {
var id: Int?
var username: Stringinit(id: Int? = nil, username: String) {
self.id = id
self.username = username
}
}extension User: Content {}extension User: Migration {}
If you now cmd+r or run we should be able to access the /users route π!
And thatβs it! You successfully configured your project to use postgresql ππ
5. Where to go from here
You can find a list of all tutorials with example projects on Github here:
ππ» https://github.com/vaporberlin/vaporschool