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.
You can find the full library documentaion here.
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:
STRING
name
: Identification name for the database (can be anything)STRING
driver
: The desired database driver, currently supports:sqlite
: Uses default Garry's Mod Sqlite interfacemysqloo
: Uses the Mysqloo Module (provides MySQL interface)file
: Uses plain files to read and store data
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 = "" })
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.
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)
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