ceifa / sqlier

Yet another gmod database abstraction

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Are you tired of these lots of heavy database libraries which do a lot of things which you don't need? You came at the right place! This project aims to offer a way of writing a very simple code only one time and be able to switch between multiple database drivers without problems. The most easier and lightweight database abstraction of the market!

Alert: This project will not fill all the edge database cases and does not aim to do so.

Documentation

You can find the full library documentaion here.

Usage

Setup a database

Firstly you will need to setup your databases, sqlier can be initialized by running the initializer function sqlier.Initialize(name, drive, conn) which accepts the following arguments:

  1. STRING name: Identification name for the database (can be anything)
  2. STRING driver: The desired database driver, currently supports:
  3. optional | STRING Connection info: Only needed when using MySqloo driver, passing the database authentication details.
 -- Sqlite
sqlier.Initialize("db1", "sqlite")

 -- MySQL
sqlier.Initialize("db2", "mysqloo", { address = "localhost", port = "3306", database = "GmodServer", user = "root", password = "" })

Setup a model

Now you will have to setup a model, it works like a class:

local User = sqlier.Model({
    Table = "user",
    Columns = {
        Id = {
            Type = sqlier.Type.Integer,
            AutoIncrement = true
        },
        Name = {
            Type = sqlier.Type.String
        },
        Rank = {
            Type = sqlier.Type.String,
            MaxLength = 15
        },
        SteamId64 = {
            Type = sqlier.Type.SteamId64
        },
        CreateTimestamp = {
            Type = sqlier.Type.Timestamp
        }
    },
    Identity = "Id"
})

The columns CreateTimestamp and UpdateTimestamp are hard-coded internally populated automatically.

Instantiate, update or delete a model

local new_user = User({
    Name = ply:Nick(),
    SteamId = ply:SteamId64(),
    Rank = "user"
})
new_user:save()

new_user.Rank = "donator"
new_user:save()

new_user:delete()

If you want to know when a save or delete is done, you can pass a callback or use their async api, if using util.Promise:

new_user:save(function()
    print("Save is done")
end)

util.PromiseAsync(function()
    new_user:saveAsync():Await()
    new_user:deleteAsync():Await()
end)

Querying

We have some simple methods to do querying:

-- The fastest way, get by identity
User:get(2, function(user)
end)

-- Find one by property filtering
User:find({ Name = "ceifa" }, function(user)
end)

-- Get many by property filtering
User:filter({ Rank = "donator" }, function(users)
end)

If you have support for util.Promise, you can use the async methods:

util.PromiseAsync(function()
    local user = User:getAsync(2):Await()
    local user = User:findAsync({ Name = "ceifa" }):Await()
    local users = User:filterAsync({ Rank = "donator" }):Await()
end)

But if you want more complex queries, you will have to do it yourself:

local user_db = User:database()
if user_db.Driver == "sqlite" or user_db.Driver == "mysqloo" then
    user_db:query("SELECT Name, COUNT(*) as Quantity FROM user GROUP BY Name", function(names)
    end)
else
    error("Database driver not supported")
end

About

Yet another gmod database abstraction

License:MIT License


Languages

Language:Lua 100.0%