Zum Inhalt springen

SQL-Datenbank

Führen Sie SQL-Abfragen gegen PostgreSQL-, MySQL- und SQLite-Datenbanken aus. Features umfassen parametrisierte Abfragen, Transaktionen, Prepared Statements und einen Fluent Query Builder.

Für Datenbankkonfiguration siehe Datenbank.

local sql = require("sql")

Holen Sie eine Datenbankverbindung aus der Ressourcen-Registry:

local db, err = sql.get("app.db:main")
if err then
return nil, err
end
local rows = db:query("SELECT * FROM users WHERE active = ?", {1})
db:release()
ParameterTypBeschreibung
idstringRessourcen-ID (z.B. “app.db:main”)

Gibt zurück: DB, error

Verbindungen werden automatisch an den Pool zurückgegeben, wenn die Funktion beendet wird, aber explizites Aufrufen von `db:release()` wird für lang laufende Operationen empfohlen. Platzhalter werden unverändert an den Datenbanktreiber übergeben; die Laufzeit schreibt sie nicht um. SQLite und MySQL verwenden `?`, PostgreSQL verwendet `$1, $2` — schreiben Sie sie in der vom Treiber erwarteten Form. Die folgenden Beispiele verwenden `?` (SQLite/MySQL). Für Abfragen, die mehrere Engines unterstützen sollen, erstellen Sie sie mit dem [Query Builder](#query-builder) und setzen Sie das `placeholder_format` des jeweiligen Dialekts.
sql.type.POSTGRES -- "postgres"
sql.type.MYSQL -- "mysql"
sql.type.SQLITE -- "sqlite"
sql.type.UNKNOWN -- "unknown"
sql.isolation.DEFAULT -- "default"
sql.isolation.READ_UNCOMMITTED -- "read_uncommitted"
sql.isolation.READ_COMMITTED -- "read_committed"
sql.isolation.WRITE_COMMITTED -- "write_committed"
sql.isolation.REPEATABLE_READ -- "repeatable_read"
sql.isolation.SERIALIZABLE -- "serializable"
local insert = sql.builder.insert("users")
:columns("name", "email")
:values("alice", sql.NULL)
local value = sql.as.int(42)

Gibt zurück: userdata

Konvertiert Wert zu SQL-Float-Typ.

local value = sql.as.float(19.99)

Gibt zurück: userdata

Konvertiert Wert zu SQL-Text-Typ.

local value = sql.as.text("hello")

Gibt zurück: userdata

Konvertiert Wert zu SQL-Binary-Typ.

local value = sql.as.binary("binary data")

Gibt zurück: userdata

Gibt SQL-NULL-Marker zurück.

local value = sql.as.null()

Gibt zurück: userdata

local query = sql.builder.select("id", "name")
:from("users")
:where({active = 1})
ParameterTypBeschreibung
columns…stringSpaltennamen (optional)

Gibt zurück: SelectBuilder

Erstellt INSERT Query Builder.

local query = sql.builder.insert("users")
:columns("name", "email")
:values("alice", "alice@example.com")
ParameterTypBeschreibung
tablestringTabellenname (optional)

Gibt zurück: InsertBuilder

Erstellt UPDATE Query Builder.

local query = sql.builder.update("users")
:set("status", "active")
:where({id = 123})
ParameterTypBeschreibung
tablestringTabellenname (optional)

Gibt zurück: UpdateBuilder

Erstellt DELETE Query Builder.

local query = sql.builder.delete("users")
:where({active = 0})
:limit(100)
ParameterTypBeschreibung
tablestringTabellenname (optional)

Gibt zurück: DeleteBuilder

Erstellt rohen SQL-Ausdruck zur Verwendung in WHERE/HAVING-Klauseln.

local expr = sql.builder.expr("score BETWEEN ? AND ?", 80, 90)
ParameterTypBeschreibung
sqlstringSQL-Ausdruck mit ?-Platzhaltern
args…anyBind-Argumente (optional)

Gibt zurück: Sqlizer

Erstellt Gleichheitsbedingung aus Table.

local cond = sql.builder.eq({active = 1, status = "open"})
ParameterTypBeschreibung
maptable{spalte = wert}-Paare

Gibt zurück: Sqlizer

Erstellt Ungleichheitsbedingung aus Table.

local cond = sql.builder.not_eq({status = "closed"})
ParameterTypBeschreibung
maptable{spalte = wert}-Paare

Gibt zurück: Sqlizer

Erstellt Kleiner-als-Bedingung aus Table.

local cond = sql.builder.lt({age = 18})
ParameterTypBeschreibung
maptable{spalte = wert}-Paare

Gibt zurück: Sqlizer

Erstellt Kleiner-gleich-Bedingung aus Table.

local cond = sql.builder.lte({price = 100})
ParameterTypBeschreibung
maptable{spalte = wert}-Paare

Gibt zurück: Sqlizer

Erstellt Größer-als-Bedingung aus Table.

local cond = sql.builder.gt({score = 80})
ParameterTypBeschreibung
maptable{spalte = wert}-Paare

Gibt zurück: Sqlizer

Erstellt Größer-gleich-Bedingung aus Table.

local cond = sql.builder.gte({age = 21})
ParameterTypBeschreibung
maptable{spalte = wert}-Paare

Gibt zurück: Sqlizer

Erstellt LIKE-Bedingung aus Table.

local cond = sql.builder.like({name = "john%"})
ParameterTypBeschreibung
maptable{spalte = wert}-Paare

Gibt zurück: Sqlizer

Erstellt NOT LIKE-Bedingung aus Table.

local cond = sql.builder.not_like({email = "%@spam.com"})
ParameterTypBeschreibung
maptable{spalte = wert}-Paare

Gibt zurück: Sqlizer

Kombiniert mehrere Bedingungen mit AND.

local cond = sql.builder.and_({
sql.builder.eq({active = 1}),
sql.builder.gt({score = 80})
})
ParameterTypBeschreibung
conditionstableArray von Sqlizer- oder Table-Bedingungen

Gibt zurück: Sqlizer

Kombiniert mehrere Bedingungen mit OR.

local cond = sql.builder.or_({
sql.builder.eq({status = "pending"}),
sql.builder.eq({status = "active"})
})
ParameterTypBeschreibung
conditionstableArray von Sqlizer- oder Table-Bedingungen

Gibt zurück: Sqlizer

Platzhalterformat für ?-Platzhalter (Standard). Verfügbar als Alias sql.builder.default_placeholder.

local query = sql.builder.select("*")
:from("users")
:placeholder_format(sql.builder.question)

Platzhalterformat für $1, $2, …-Platzhalter.

local query = sql.builder.select("*")
:from("users")
:placeholder_format(sql.builder.dollar)

Platzhalterformat für @p1, @p2, ...-Platzhalter (SQL-Server-Stil). Wird wie die obigen Formate an placeholder_format übergeben.

Platzhalterformat für :1, :2, ...-Platzhalter. Wird wie die obigen Formate an placeholder_format übergeben.

Datenbankverbindungs-Handle zurückgegeben von sql.get().

Gibt Datenbanktyp-Konstante zurück.

local dbtype, err = db:type()

Gibt zurück: string, error

Führt SELECT-Abfrage aus und gibt Zeilen zurück.

local rows, err = db:query("SELECT id, name FROM users WHERE active = ?", {1})
ParameterTypBeschreibung
sqlstringSQL-Abfrage mit ?-Platzhaltern
paramstableArray von Bind-Parametern (optional)

Gibt zurück: table[], error

Führt INSERT/UPDATE/DELETE-Abfrage aus.

local result, err = db:execute("INSERT INTO users (name) VALUES (?)", {"alice"})
ParameterTypBeschreibung
sqlstringSQL-Anweisung mit ?-Platzhaltern
paramstableArray von Bind-Parametern (optional)

Gibt zurück: table, error

Gibt Table mit Feldern zurück:

  • last_insert_id - Zuletzt eingefügte ID
  • rows_affected - Anzahl betroffener Zeilen

Erstellt Prepared Statement für wiederholte Ausführung.

local stmt, err = db:prepare("SELECT * FROM users WHERE id = ?")
ParameterTypBeschreibung
sqlstringSQL mit ?-Platzhaltern

Gibt zurück: Statement, error

Beginnt Datenbanktransaktion.

local tx, err = db:begin({
isolation = sql.isolation.SERIALIZABLE,
read_only = false
})
ParameterTypBeschreibung
optionstableTransaktionsoptionen (optional)

Options-Table-Felder:

  • isolation - Isolationsebene aus sql.isolation.* (Standard: DEFAULT)
  • read_only - Nur-Lesen-Transaktions-Flag (Standard: false)

Gibt zurück: Transaction, error

Gibt Datenbankressource an Pool zurück.

local ok, err = db:release()

Gibt zurück: boolean, error

Gibt Verbindungspool-Statistiken zurück.

local stats, err = db:stats()

Gibt zurück: table, error

Gibt Table mit Feldern zurück:

  • max_open_connections - Max. erlaubte offene Verbindungen
  • open_connections - Aktuelle offene Verbindungen
  • in_use - Aktuell verwendete Verbindungen
  • idle - Ungenutzte Verbindungen im Pool
  • wait_count - Gesamte Verbindungs-Warteanzahl
  • wait_duration - Gesamte Wartezeit
  • max_idle_closed - Wegen max idle geschlossene Verbindungen
  • max_idle_time_closed - Wegen idle Timeout geschlossene Verbindungen
  • max_lifetime_closed - Wegen max lifetime geschlossene Verbindungen

Prepared Statement zurückgegeben von db:prepare().

Führt Prepared Statement als SELECT aus.

local rows, err = stmt:query({123})
ParameterTypBeschreibung
paramstableArray von Bind-Parametern (optional)

Gibt zurück: table[], error

Führt Prepared Statement als INSERT/UPDATE/DELETE aus.

local result, err = stmt:execute({"alice"})
ParameterTypBeschreibung
paramstableArray von Bind-Parametern (optional)

Gibt zurück: table, error

Gibt Table mit Feldern zurück:

  • last_insert_id - Zuletzt eingefügte ID
  • rows_affected - Anzahl betroffener Zeilen

Schließt Prepared Statement.

local ok, err = stmt:close()

Gibt zurück: boolean, error

Datenbanktransaktion zurückgegeben von db:begin().

Gibt Datenbanktyp-Konstante zurück.

local dbtype, err = tx:db_type()

Gibt zurück: string, error

Führt SELECT-Abfrage innerhalb der Transaktion aus.

local rows, err = tx:query("SELECT id, name FROM users WHERE active = ?", {1})
ParameterTypBeschreibung
sqlstringSQL-Abfrage mit ?-Platzhaltern
paramstableArray von Bind-Parametern (optional)

Gibt zurück: table[], error

Führt INSERT/UPDATE/DELETE innerhalb der Transaktion aus.

local result, err = tx:execute("INSERT INTO users (name) VALUES (?)", {"alice"})
ParameterTypBeschreibung
sqlstringSQL-Anweisung mit ?-Platzhaltern
paramstableArray von Bind-Parametern (optional)

Gibt zurück: table, error

Gibt Table mit Feldern zurück:

  • last_insert_id - Zuletzt eingefügte ID
  • rows_affected - Anzahl betroffener Zeilen

Erstellt Prepared Statement innerhalb der Transaktion.

local stmt, err = tx:prepare("SELECT * FROM users WHERE id = ?")
ParameterTypBeschreibung
sqlstringSQL mit ?-Platzhaltern

Gibt zurück: Statement, error

Committet die Transaktion.

local ok, err = tx:commit()

Gibt zurück: boolean, error

Rollt die Transaktion zurück.

local ok, err = tx:rollback()

Gibt zurück: boolean, error

Erstellt benannten Savepoint innerhalb der Transaktion.

local ok, err = tx:savepoint("sp1")
ParameterTypBeschreibung
namestringSavepoint-Name (nur alphanumerisch und Unterstrich)

Gibt zurück: boolean, error

Rollt zum benannten Savepoint zurück.

local ok, err = tx:rollback_to("sp1")
ParameterTypBeschreibung
namestringSavepoint-Name

Gibt zurück: boolean, error

Gibt Savepoint frei.

local ok, err = tx:release("sp1")
ParameterTypBeschreibung
namestringSavepoint-Name

Gibt zurück: boolean, error

Fluent-Interface zum Erstellen von SELECT-Abfragen.

Setzt FROM-Klausel.

local query = sql.builder.select("id", "name"):from("users")
ParameterTypBeschreibung
tablestringTabellenname

Gibt zurück: SelectBuilder

Fügt JOIN-Klausel hinzu.

local query = sql.builder.select("*")
:from("users")
:join("orders ON orders.user_id = users.id")
ParameterTypBeschreibung
joinstringJOIN-Klausel mit ?-Platzhaltern
args…anyBind-Argumente (optional)

Gibt zurück: SelectBuilder

Fügt LEFT JOIN-Klausel hinzu.

local query = sql.builder.select("*")
:from("users")
:left_join("orders ON orders.user_id = users.id")
ParameterTypBeschreibung
joinstringJOIN-Klausel mit ?-Platzhaltern
args…anyBind-Argumente (optional)

Gibt zurück: SelectBuilder

Fügt RIGHT JOIN-Klausel hinzu.

local query = sql.builder.select("*")
:from("users")
:right_join("orders ON orders.user_id = users.id")
ParameterTypBeschreibung
joinstringJOIN-Klausel mit ?-Platzhaltern
args…anyBind-Argumente (optional)

Gibt zurück: SelectBuilder

Fügt INNER JOIN-Klausel hinzu.

local query = sql.builder.select("*")
:from("users")
:inner_join("orders ON orders.user_id = users.id")
ParameterTypBeschreibung
joinstringJOIN-Klausel mit ?-Platzhaltern
args…anyBind-Argumente (optional)

Gibt zurück: SelectBuilder

Fügt WHERE-Bedingung hinzu.

local query = sql.builder.select("*")
:from("users")
:where({active = 1})
ParameterTypBeschreibung
conditionstring|table|SqlizerWHERE-Bedingung
args…anyBind-Argumente (optional, bei String-Verwendung)

Unterstützt drei Formate:

  • String: where("status = ?", "active")
  • Table: where({status = "active"})
  • Sqlizer: where(sql.builder.gt({score = 80}))

Gibt zurück: SelectBuilder

Fügt ORDER BY-Klausel hinzu.

local query = sql.builder.select("*")
:from("users")
:order_by("name ASC", "created_at DESC")
ParameterTypBeschreibung
columns…stringSpaltennamen mit optionalem ASC/DESC

Gibt zurück: SelectBuilder

Fügt GROUP BY-Klausel hinzu.

local query = sql.builder.select("status", "COUNT(*)")
:from("users")
:group_by("status")
ParameterTypBeschreibung
columns…stringSpaltennamen

Gibt zurück: SelectBuilder

Fügt HAVING-Bedingung hinzu.

local query = sql.builder.select("status", "COUNT(*) as cnt")
:from("users")
:group_by("status")
:having(sql.builder.gt({cnt = 10}))
ParameterTypBeschreibung
conditionstring|table|SqlizerHAVING-Bedingung
args…anyBind-Argumente (optional, bei String-Verwendung)

Gibt zurück: SelectBuilder

Setzt LIMIT.

local query = sql.builder.select("*")
:from("users")
:limit(10)
ParameterTypBeschreibung
nintegerLimit-Wert

Gibt zurück: SelectBuilder

Setzt OFFSET.

local query = sql.builder.select("*")
:from("users")
:offset(20)
ParameterTypBeschreibung
nintegerOffset-Wert

Gibt zurück: SelectBuilder

Fügt Spalten zu SELECT hinzu.

local query = sql.builder.select():columns("id", "name", "email")
ParameterTypBeschreibung
columns…stringSpaltennamen

Gibt zurück: SelectBuilder

Fügt DISTINCT-Modifikator hinzu.

local query = sql.builder.select("status")
:from("users")
:distinct()

Gibt zurück: SelectBuilder

Fügt SQL-Suffix hinzu.

local query = sql.builder.select("*")
:from("users")
:suffix("FOR UPDATE")
ParameterTypBeschreibung
sqlstringSQL-Suffix mit ?-Platzhaltern
args…anyBind-Argumente (optional)

Gibt zurück: SelectBuilder

Setzt Platzhalterformat.

local query = sql.builder.select("*")
:from("users")
:placeholder_format(sql.builder.dollar)
ParameterTypBeschreibung
formatuserdataPlatzhalterformat (sql.builder.*)

Gibt zurück: SelectBuilder

Generiert SQL-String und Bind-Argumente.

local sql_str, args = query:to_sql()

Gibt zurück: string, table

Erstellt Executor für Abfrage.

local executor = query:run_with(db)
local rows, err = executor:query()
ParameterTypBeschreibung
dbDB|TransactionDatenbank- oder Transaktions-Handle

Gibt zurück: QueryExecutor

Fluent-Interface zum Erstellen von INSERT-Abfragen.

Setzt Tabellennamen.

local query = sql.builder.insert():into("users")
ParameterTypBeschreibung
tablestringTabellenname

Gibt zurück: InsertBuilder

Setzt Spaltennamen.

local query = sql.builder.insert("users"):columns("name", "email")
ParameterTypBeschreibung
columns…stringSpaltennamen

Gibt zurück: InsertBuilder

Fügt Zeilenwerte hinzu.

local query = sql.builder.insert("users")
:columns("name", "email")
:values("alice", "alice@example.com")
ParameterTypBeschreibung
values…anyZeilenwerte

Gibt zurück: InsertBuilder

Setzt Spalten und Werte aus Table.

local query = sql.builder.insert("users")
:set_map({name = "alice", email = "alice@example.com"})
ParameterTypBeschreibung
maptable{spalte = wert}-Paare

Gibt zurück: InsertBuilder

Fügt aus SELECT-Abfrage ein.

local select_query = sql.builder.select("name", "email"):from("temp_users")
local query = sql.builder.insert("users")
:columns("name", "email")
:select(select_query)
ParameterTypBeschreibung
querySelectBuilderSELECT-Abfrage

Gibt zurück: InsertBuilder

Fügt SQL-Präfix hinzu.

local query = sql.builder.insert("users")
:prefix("INSERT IGNORE INTO")
ParameterTypBeschreibung
sqlstringSQL-Präfix mit ?-Platzhaltern
args…anyBind-Argumente (optional)

Gibt zurück: InsertBuilder

Fügt SQL-Suffix hinzu.

local query = sql.builder.insert("users")
:columns("name")
:values("alice")
:suffix("RETURNING id")
ParameterTypBeschreibung
sqlstringSQL-Suffix mit ?-Platzhaltern
args…anyBind-Argumente (optional)

Gibt zurück: InsertBuilder

Fügt INSERT-Optionen hinzu.

local query = sql.builder.insert("users")
:options("DELAYED", "IGNORE")
ParameterTypBeschreibung
options…stringINSERT-Optionen

Gibt zurück: InsertBuilder

Setzt Platzhalterformat.

local query = sql.builder.insert("users")
:placeholder_format(sql.builder.dollar)
ParameterTypBeschreibung
formatuserdataPlatzhalterformat (sql.builder.*)

Gibt zurück: InsertBuilder

Generiert SQL-String und Bind-Argumente.

local sql_str, args = query:to_sql()

Gibt zurück: string, table

Erstellt Executor für Abfrage.

local executor = query:run_with(db)
local result, err = executor:exec()
ParameterTypBeschreibung
dbDB|TransactionDatenbank- oder Transaktions-Handle

Gibt zurück: QueryExecutor

Fluent-Interface zum Erstellen von UPDATE-Abfragen.

Setzt Tabellennamen.

local query = sql.builder.update():table("users")
ParameterTypBeschreibung
tablestringTabellenname

Gibt zurück: UpdateBuilder

Setzt Spaltenwert.

local query = sql.builder.update("users")
:set("status", "active")
:set("updated_at", sql.builder.expr("NOW()"))
ParameterTypBeschreibung
columnstringSpaltenname
valueanySpaltenwert

Gibt zurück: UpdateBuilder

Setzt mehrere Spalten aus Table.

local query = sql.builder.update("users")
:set_map({status = "active", updated_at = sql.builder.expr("NOW()")})
ParameterTypBeschreibung
maptable{spalte = wert}-Paare

Gibt zurück: UpdateBuilder

Fügt WHERE-Bedingung hinzu.

local query = sql.builder.update("users")
:set("status", "active")
:where({id = 123})
ParameterTypBeschreibung
conditionstring|table|SqlizerWHERE-Bedingung
args…anyBind-Argumente (optional, bei String-Verwendung)

Gibt zurück: UpdateBuilder

Fügt ORDER BY-Klausel hinzu.

local query = sql.builder.update("users")
:set("rank", 1)
:order_by("score DESC")
ParameterTypBeschreibung
columns…stringSpaltennamen mit optionalem ASC/DESC

Gibt zurück: UpdateBuilder

Setzt LIMIT.

local query = sql.builder.update("users")
:set("status", "active")
:limit(10)
ParameterTypBeschreibung
nintegerLimit-Wert

Gibt zurück: UpdateBuilder

Setzt OFFSET.

local query = sql.builder.update("users")
:set("status", "active")
:offset(5)
ParameterTypBeschreibung
nintegerOffset-Wert

Gibt zurück: UpdateBuilder

Fügt SQL-Suffix hinzu.

local query = sql.builder.update("users")
:set("status", "active")
:suffix("RETURNING id")
ParameterTypBeschreibung
sqlstringSQL-Suffix mit ?-Platzhaltern
args…anyBind-Argumente (optional)

Gibt zurück: UpdateBuilder

Fügt FROM-Klausel hinzu.

local query = sql.builder.update("users")
:set("status", "active")
:from("other_table")
ParameterTypBeschreibung
tablestringTabellenname

Gibt zurück: UpdateBuilder

Aktualisiert aus SELECT-Abfrage.

local select_query = sql.builder.select("*"):from("temp_users")
local query = sql.builder.update("users")
:set("status", "active")
:from_select(select_query, "t")
ParameterTypBeschreibung
querySelectBuilderSELECT-Abfrage
aliasstringTabellen-Alias

Gibt zurück: UpdateBuilder

Setzt Platzhalterformat.

local query = sql.builder.update("users")
:placeholder_format(sql.builder.dollar)
ParameterTypBeschreibung
formatuserdataPlatzhalterformat (sql.builder.*)

Gibt zurück: UpdateBuilder

Generiert SQL-String und Bind-Argumente.

local sql_str, args = query:to_sql()

Gibt zurück: string, table

Erstellt Executor für Abfrage.

local executor = query:run_with(db)
local result, err = executor:exec()
ParameterTypBeschreibung
dbDB|TransactionDatenbank- oder Transaktions-Handle

Gibt zurück: QueryExecutor

Fluent-Interface zum Erstellen von DELETE-Abfragen.

Setzt Tabellennamen.

local query = sql.builder.delete():from("users")
ParameterTypBeschreibung
tablestringTabellenname

Gibt zurück: DeleteBuilder

Fügt WHERE-Bedingung hinzu.

local query = sql.builder.delete("users")
:where({active = 0})
ParameterTypBeschreibung
conditionstring|table|SqlizerWHERE-Bedingung
args…anyBind-Argumente (optional, bei String-Verwendung)

Gibt zurück: DeleteBuilder

Fügt ORDER BY-Klausel hinzu.

local query = sql.builder.delete("users")
:where({active = 0})
:order_by("created_at ASC")
ParameterTypBeschreibung
columns…stringSpaltennamen mit optionalem ASC/DESC

Gibt zurück: DeleteBuilder

Setzt LIMIT.

local query = sql.builder.delete("users")
:where({active = 0})
:limit(100)
ParameterTypBeschreibung
nintegerLimit-Wert

Gibt zurück: DeleteBuilder

Setzt OFFSET.

local query = sql.builder.delete("users")
:where({active = 0})
:offset(10)
ParameterTypBeschreibung
nintegerOffset-Wert

Gibt zurück: DeleteBuilder

Fügt SQL-Suffix hinzu.

local query = sql.builder.delete("users")
:where({active = 0})
:suffix("RETURNING id")
ParameterTypBeschreibung
sqlstringSQL-Suffix mit ?-Platzhaltern
args…anyBind-Argumente (optional)

Gibt zurück: DeleteBuilder

Setzt Platzhalterformat.

local query = sql.builder.delete("users")
:placeholder_format(sql.builder.dollar)
ParameterTypBeschreibung
formatuserdataPlatzhalterformat (sql.builder.*)

Gibt zurück: DeleteBuilder

Generiert SQL-String und Bind-Argumente.

local sql_str, args = query:to_sql()

Gibt zurück: string, table

Erstellt Executor für Abfrage.

local executor = query:run_with(db)
local result, err = executor:exec()
ParameterTypBeschreibung
dbDB|TransactionDatenbank- oder Transaktions-Handle

Gibt zurück: QueryExecutor

Der Query-Executor führt vom Builder generierte Abfragen aus.

Führt Abfrage aus und gibt Zeilen zurück (für SELECT).

local rows, err = executor:query()

Gibt zurück: table[], error

Führt Abfrage aus und gibt Ergebnis zurück (für INSERT/UPDATE/DELETE).

local result, err = executor:exec()

Gibt zurück: table, error

Gibt Table mit Feldern zurück:

  • last_insert_id - Zuletzt eingefügte ID
  • rows_affected - Anzahl betroffener Zeilen

Gibt generierten SQL und Argumente ohne Ausführung zurück.

local sql_str, args = executor:to_sql()

Gibt zurück: string, table

Datenbankzugriff unterliegt der Sicherheitsrichtlinienauswertung.

AktionRessourceBeschreibung
db.getDatenbank-IDDatenbankverbindung abrufen
BedingungArtWiederholbar
Leere Ressourcen-IDerrors.INVALIDnein
Berechtigung verweigerterrors.PERMISSION_DENIEDnein
Ressource nicht gefundenerrors.NOT_FOUNDnein
Ressource keine Datenbankerrors.INVALIDnein
Ungültige Parametererrors.INVALIDnein
SQL-Syntaxfehlererrors.INVALIDnein
Statement geschlossenerrors.INVALIDnein
Transaktion nicht aktiverrors.INVALIDnein
Ungültiger Savepoint-Nameerrors.INVALIDnein
Abfrageausführungsfehlervariiertvariiert

Siehe Fehlerbehandlung für die Arbeit mit Fehlern.

local sql = require("sql")
-- Datenbankverbindung holen
local db, err = sql.get("app.db:main")
if err then error(err) end
-- Datenbanktyp prüfen
local dbtype, _ = db:type()
print("Database type:", dbtype)
-- Direkte Abfrage
local users, err = db:query("SELECT id, name FROM users WHERE active = ?", {1})
if err then error(err) end
for _, user in ipairs(users) do
print(user.id, user.name)
end
-- Builder-Muster
local query = sql.builder.select("u.id", "u.name", "COUNT(o.id) as order_count")
:from("users u")
:left_join("orders o ON o.user_id = u.id")
:where(sql.builder.and_({
sql.builder.eq({["u.active"] = 1}),
sql.builder.gte({["u.score"] = 80})
}))
:group_by("u.id", "u.name")
:having(sql.builder.gt({["COUNT(o.id)"] = 0}))
:order_by("order_count DESC")
:limit(10)
local executor = query:run_with(db)
local results, err = executor:query()
if err then error(err) end
-- Transaktion mit Savepoints
local tx, err = db:begin({isolation = sql.isolation.SERIALIZABLE})
if err then error(err) end
local _, err = tx:execute("INSERT INTO users (name) VALUES (?)", {"alice"})
if err then
tx:rollback()
error(err)
end
tx:savepoint("sp1")
local _, err = tx:execute("UPDATE users SET status = ? WHERE id = ?", {"active", 1})
if err then
tx:rollback_to("sp1")
else
tx:release("sp1")
end
local ok, err = tx:commit()
if err then error(err) end
-- Prepared Statements
local stmt, err = db:prepare("INSERT INTO logs (message, level) VALUES (?, ?)")
if err then error(err) end
for i = 1, 100 do
local _, err = stmt:execute({"log message " .. i, "info"})
if err then
stmt:close()
error(err)
end
end
stmt:close()
-- NULL und typisierte Werte
local insert = sql.builder.insert("products")
:columns("name", "price", "description")
:values("Widget", sql.as.float(19.99), sql.NULL)
local executor = insert:run_with(db)
local result, err = executor:exec()
if err then error(err) end
print("Inserted ID:", result.last_insert_id)
db:release()