İçeriğe geç

ORM (lib/orm)

lib/orm.tpr, ham db_execute / db_query çağrılarını kodun geri kalanı gibi okunan bir API’ye dönüştüren küçük bir Active-Record style mini-ORM’dir.

import "orm";
orm_open("app.db");
define_model("users", {
"id": "INTEGER PRIMARY KEY AUTOINCREMENT",
"name": "TEXT NOT NULL",
"age": "INTEGER"
});
int id = orm_create("users", {"name": "Hamza", "age": 23});
json u = orm_find("users", id);
print(u["name"]); // "Hamza"
orm_update("users", id, {"age": 24});
array adults = orm_where("users", "age >= 18");
orm_delete("users", id);
orm_close();

define_model(table, columns) tabloyu CREATE TABLE IF NOT EXISTS ile oluşturur. columns haritası ekleme sırasını korur — üretilen DDL yazdığınla birebir:

define_model("posts", {
"id": "INTEGER PRIMARY KEY AUTOINCREMENT",
"user_id": "INTEGER NOT NULL",
"title": "TEXT NOT NULL",
"body": "TEXT",
"created_at": "TEXT DEFAULT (datetime('now'))"
});

Değerler verbatim geçer — SQLite’ın CREATE TABLE kolon pozisyonunda kabul ettiği her şey çalışır (INTEGER, TEXT, REAL, BLOB, PRIMARY KEY, NOT NULL, DEFAULT (...), REFERENCES other(id), …).

FonksiyonDönerNotlar
orm_open(path)int handleTest için :memory: kullan.
orm_close()
define_model(table, columns)Idempotent (CREATE TABLE IF NOT EXISTS).
orm_create(table, attrs)int last id
orm_find(table, id)json satır veya {}
orm_all(table)array<json>
orm_where(table, where_sql)array<json>where_sql ham SQL — input’u SEN sanitize et!
orm_update(table, id, attrs)int 1/0Sadece attrs’taki kolonlar değişir.
orm_delete(table, id)int 1

30 satırda dört-route REST API:

import "wings";
import "orm";
orm_open("app.db");
define_model("posts", {
"id": "INTEGER PRIMARY KEY AUTOINCREMENT",
"title": "TEXT NOT NULL",
"body": "TEXT"
});
func list_posts() { return orm_all("posts"); }
func show_post() { return orm_find("posts", toInt(_request["params"]["id"])); }
func create_post() {
int id = orm_create("posts", _request["body"]);
return orm_find("posts", id);
}
func delete_post() {
orm_delete("posts", toInt(_request["params"]["id"]));
return {"ok": 1};
}
get("/posts", "list_posts");
get("/posts/:id", "show_post");
post("/posts", "create_post");
del("/posts/:id", "delete_post");
listen_async(8080);