Reservoir

arthurpaulino/LeanMySQL

A MySQL API for Lean 4

GitHub Link Documentation

Pick a version!

TODO: should show a time axes that allows the users to view, filter and click copy the lakefile config.

README

LeanMySQL

This Lean 4 package provides an API for the MySQL database.

Usage example:

20 IO.println $ df mysql.close">
import LeanMySQL

def main : IO Unit := do
  let mysql ← MySQL.mk
  IO.println $ mysql.version
  mysql.login "localhost" "root" "root"
  mysql.createDB "test_db"
  mysql.useDB "test_db"

  mysql.createTable "job" [
    ("id", "INT PRIMARY KEY"),
    ("job_name", "VARCHAR(255)")
  ]
  mysql.insertIntoTable "job" [1, "Computer Scientist"]
  mysql.insertIntoTable "job" [2, "Mathematician"]

  mysql.createTable "person" [
      ("id", "INT PRIMARY KEY"),
      ("name", "VARCHAR(255)"),
      ("age", "INT"),
      ("height", "FLOAT"),
      ("job_id", "INT"),
      ("country_id", "INT")
    ]
  mysql.insertIntoTable "person" [1, "Alice", 20, 1.72, 1, 1]
  mysql.insertIntoTable "person" [2, "Bob", 21, 1.64, 2, 3]
  mysql.insertIntoTable "person" [3, "Craig", 22, 1.76, NULL, 2]

  let df ← mysql.query $
    SELECT name, age, height, job_name
    FROM person LEFT JOIN job ON person.job_id = job.id
    WHERE person.age > 20

  IO.println $ df

  mysql.close

The example above prints out:

8.0.28
|   name|age|height|       job_name|
|-------|---|------|---------------|
|  'Bob'| 21|  1.64|'Mathematician'|
|'Craig'| 22|  1.76|           NULL|

What's next?

  • Allow queries on the FROM clause (nested queries)
  • Expand the implicit join so it can accept multiple sources, not just two

Feel free to contribute! :D