SQLデータベース
SQLデータベース
Section titled “SQLデータベース”PostgreSQL、MySQL、SQLiteデータベースに対してSQLクエリを実行。パラメータ化クエリ、トランザクション、プリペアドステートメント、流暢なクエリビルダーをサポート。
データベース設定についてはデータベースを参照。
local sql = require("sql")リソースレジストリからデータベース接続を取得:
local db, err = sql.get("app.db:main")if err then return nil, errend
local rows = db:query("SELECT * FROM users WHERE active = ?", {1})
db:release()| パラメータ | 型 | 説明 |
|---|---|---|
id | string | リソースID(例: “app.db:main”) |
戻り値: DB, error
データベースタイプ
Section titled “データベースタイプ”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)as.int
Section titled “as.int”local value = sql.as.int(42)戻り値: userdata
as.float
Section titled “as.float”値をSQL float型に変換。
local value = sql.as.float(19.99)戻り値: userdata
as.text
Section titled “as.text”値をSQL text型に変換。
local value = sql.as.text("hello")戻り値: userdata
as.binary
Section titled “as.binary”値をSQL binary型に変換。
local value = sql.as.binary("binary data")戻り値: userdata
as.null
Section titled “as.null”SQL NULLマーカーを返す。
local value = sql.as.null()戻り値: userdata
クエリビルダー
Section titled “クエリビルダー”クエリの作成
Section titled “クエリの作成”local query = sql.builder.select("id", "name") :from("users") :where({active = 1})| パラメータ | 型 | 説明 |
|---|---|---|
columns | …string | カラム名(オプション) |
戻り値: SelectBuilder
builder.insert
Section titled “builder.insert”INSERTクエリビルダーを作成。
local query = sql.builder.insert("users") :columns("name", "email") :values("alice", "alice@example.com")| パラメータ | 型 | 説明 |
|---|---|---|
table | string | テーブル名(オプション) |
戻り値: InsertBuilder
builder.update
Section titled “builder.update”UPDATEクエリビルダーを作成。
local query = sql.builder.update("users") :set("status", "active") :where({id = 123})| パラメータ | 型 | 説明 |
|---|---|---|
table | string | テーブル名(オプション) |
戻り値: UpdateBuilder
builder.delete
Section titled “builder.delete”DELETEクエリビルダーを作成。
local query = sql.builder.delete("users") :where({active = 0}) :limit(100)| パラメータ | 型 | 説明 |
|---|---|---|
table | string | テーブル名(オプション) |
戻り値: DeleteBuilder
builder.expr
Section titled “builder.expr”where/having句で使用する生のSQL式を作成。
local expr = sql.builder.expr("score BETWEEN ? AND ?", 80, 90)| パラメータ | 型 | 説明 |
|---|---|---|
sql | string | ?プレースホルダー付きSQL式 |
args | …any | バインド引数(オプション) |
戻り値: Sqlizer
builder.eq
Section titled “builder.eq”テーブルから等価条件を作成。
local cond = sql.builder.eq({active = 1, status = "open"})| パラメータ | 型 | 説明 |
|---|---|---|
map | table | {column = value}ペア |
戻り値: Sqlizer
builder.not_eq
Section titled “builder.not_eq”テーブルから不等価条件を作成。
local cond = sql.builder.not_eq({status = "closed"})| パラメータ | 型 | 説明 |
|---|---|---|
map | table | {column = value}ペア |
戻り値: Sqlizer
builder.lt
Section titled “builder.lt”テーブルから小なり条件を作成。
local cond = sql.builder.lt({age = 18})| パラメータ | 型 | 説明 |
|---|---|---|
map | table | {column = value}ペア |
戻り値: Sqlizer
builder.lte
Section titled “builder.lte”テーブルから以下条件を作成。
local cond = sql.builder.lte({price = 100})| パラメータ | 型 | 説明 |
|---|---|---|
map | table | {column = value}ペア |
戻り値: Sqlizer
builder.gt
Section titled “builder.gt”テーブルから大なり条件を作成。
local cond = sql.builder.gt({score = 80})| パラメータ | 型 | 説明 |
|---|---|---|
map | table | {column = value}ペア |
戻り値: Sqlizer
builder.gte
Section titled “builder.gte”テーブルから以上条件を作成。
local cond = sql.builder.gte({age = 21})| パラメータ | 型 | 説明 |
|---|---|---|
map | table | {column = value}ペア |
戻り値: Sqlizer
builder.like
Section titled “builder.like”テーブルからLIKE条件を作成。
local cond = sql.builder.like({name = "john%"})| パラメータ | 型 | 説明 |
|---|---|---|
map | table | {column = value}ペア |
戻り値: Sqlizer
builder.not_like
Section titled “builder.not_like”テーブルからNOT LIKE条件を作成。
local cond = sql.builder.not_like({email = "%@spam.com"})| パラメータ | 型 | 説明 |
|---|---|---|
map | table | {column = value}ペア |
戻り値: Sqlizer
builder.and_
Section titled “builder.and_”複数の条件をANDで結合。
local cond = sql.builder.and_({ sql.builder.eq({active = 1}), sql.builder.gt({score = 80})})| パラメータ | 型 | 説明 |
|---|---|---|
conditions | table | Sqlizerまたはテーブル条件の配列 |
戻り値: Sqlizer
builder.or_
Section titled “builder.or_”複数の条件をORで結合。
local cond = sql.builder.or_({ sql.builder.eq({status = "pending"}), sql.builder.eq({status = "active"})})| パラメータ | 型 | 説明 |
|---|---|---|
conditions | table | Sqlizerまたはテーブル条件の配列 |
戻り値: Sqlizer
builder.question
Section titled “builder.question”?プレースホルダー用のプレースホルダーフォーマット(デフォルト)。sql.builder.default_placeholder のエイリアスとして利用可能です。
local query = sql.builder.select("*") :from("users") :placeholder_format(sql.builder.question)builder.dollar
Section titled “builder.dollar”$1, $2, …プレースホルダー用のプレースホルダーフォーマット。
local query = sql.builder.select("*") :from("users") :placeholder_format(sql.builder.dollar)builder.at
Section titled “builder.at”@p1, @p2, ...プレースホルダー用のプレースホルダーフォーマット(SQL Server スタイル)。上記のフォーマットと同様に placeholder_format に渡します。
builder.colon
Section titled “builder.colon”:1, :2, ...プレースホルダー用のプレースホルダーフォーマット。上記のフォーマットと同様に placeholder_format に渡します。
接続メソッド
Section titled “接続メソッド”sql.get()が返すデータベース接続ハンドル。
db:type
Section titled “db:type”データベースタイプ定数を返す。
local dbtype, err = db:type()戻り値: string, error
db:query
Section titled “db:query”SELECTクエリを実行し行を返す。
local rows, err = db:query("SELECT id, name FROM users WHERE active = ?", {1})| パラメータ | 型 | 説明 |
|---|---|---|
sql | string | ?プレースホルダー付きSQLクエリ |
params | table | バインドパラメータの配列(オプション) |
戻り値: table[], error
db:execute
Section titled “db:execute”INSERT/UPDATE/DELETEクエリを実行。
local result, err = db:execute("INSERT INTO users (name) VALUES (?)", {"alice"})| パラメータ | 型 | 説明 |
|---|---|---|
sql | string | ?プレースホルダー付きSQLステートメント |
params | table | バインドパラメータの配列(オプション) |
戻り値: table, error
フィールド付きテーブルを返す:
last_insert_id- 最後に挿入されたIDrows_affected- 影響を受けた行数
db:prepare
Section titled “db:prepare”繰り返し実行用のプリペアドステートメントを作成。
local stmt, err = db:prepare("SELECT * FROM users WHERE id = ?")| パラメータ | 型 | 説明 |
|---|---|---|
sql | string | ?プレースホルダー付きSQL |
戻り値: Statement, error
db:begin
Section titled “db:begin”データベーストランザクションを開始。
local tx, err = db:begin({ isolation = sql.isolation.SERIALIZABLE, read_only = false})| パラメータ | 型 | 説明 |
|---|---|---|
options | table | トランザクションオプション(オプション) |
オプションテーブルのフィールド:
isolation- sql.isolation.*からの分離レベル(デフォルト: DEFAULT)read_only- 読み取り専用トランザクションフラグ(デフォルト: false)
戻り値: Transaction, error
db:release
Section titled “db:release”データベースリソースをプールに戻す。
local ok, err = db:release()戻り値: boolean, error
db:stats
Section titled “db:stats”接続プール統計を返す。
local stats, err = db:stats()戻り値: table, error
フィールド付きテーブルを返す:
max_open_connections- 最大許容オープン接続数open_connections- 現在のオープン接続数in_use- 現在使用中の接続数idle- プール内のアイドル接続数wait_count- 合計接続待機カウントwait_duration- 合計待機時間max_idle_closed- 最大アイドルにより閉じられた接続数max_idle_time_closed- アイドルタイムアウトにより閉じられた接続数max_lifetime_closed- 最大ライフタイムにより閉じられた接続数
プリペアドステートメント
Section titled “プリペアドステートメント”db:prepare()が返すプリペアドステートメント。
stmt:query
Section titled “stmt:query”プリペアドステートメントをSELECTとして実行。
local rows, err = stmt:query({123})| パラメータ | 型 | 説明 |
|---|---|---|
params | table | バインドパラメータの配列(オプション) |
戻り値: table[], error
stmt:execute
Section titled “stmt:execute”プリペアドステートメントをINSERT/UPDATE/DELETEとして実行。
local result, err = stmt:execute({"alice"})| パラメータ | 型 | 説明 |
|---|---|---|
params | table | バインドパラメータの配列(オプション) |
戻り値: table, error
フィールド付きテーブルを返す:
last_insert_id- 最後に挿入されたIDrows_affected- 影響を受けた行数
stmt:close
Section titled “stmt:close”プリペアドステートメントを閉じる。
local ok, err = stmt:close()戻り値: boolean, error
トランザクション
Section titled “トランザクション”db:begin()が返すデータベーストランザクション。
tx:db_type
Section titled “tx:db_type”データベースタイプ定数を返す。
local dbtype, err = tx:db_type()戻り値: string, error
tx:query
Section titled “tx:query”トランザクション内でSELECTクエリを実行。
local rows, err = tx:query("SELECT id, name FROM users WHERE active = ?", {1})| パラメータ | 型 | 説明 |
|---|---|---|
sql | string | ?プレースホルダー付きSQLクエリ |
params | table | バインドパラメータの配列(オプション) |
戻り値: table[], error
tx:execute
Section titled “tx:execute”トランザクション内でINSERT/UPDATE/DELETEを実行。
local result, err = tx:execute("INSERT INTO users (name) VALUES (?)", {"alice"})| パラメータ | 型 | 説明 |
|---|---|---|
sql | string | ?プレースホルダー付きSQLステートメント |
params | table | バインドパラメータの配列(オプション) |
戻り値: table, error
フィールド付きテーブルを返す:
last_insert_id- 最後に挿入されたIDrows_affected- 影響を受けた行数
tx:prepare
Section titled “tx:prepare”トランザクション内でプリペアドステートメントを作成。
local stmt, err = tx:prepare("SELECT * FROM users WHERE id = ?")| パラメータ | 型 | 説明 |
|---|---|---|
sql | string | ?プレースホルダー付きSQL |
戻り値: Statement, error
tx:commit
Section titled “tx:commit”トランザクションをコミット。
local ok, err = tx:commit()戻り値: boolean, error
tx:rollback
Section titled “tx:rollback”トランザクションをロールバック。
local ok, err = tx:rollback()戻り値: boolean, error
tx:savepoint
Section titled “tx:savepoint”トランザクション内に名前付きセーブポイントを作成。
local ok, err = tx:savepoint("sp1")| パラメータ | 型 | 説明 |
|---|---|---|
name | string | セーブポイント名(英数字とアンダースコアのみ) |
戻り値: boolean, error
tx:rollback_to
Section titled “tx:rollback_to”名前付きセーブポイントにロールバック。
local ok, err = tx:rollback_to("sp1")| パラメータ | 型 | 説明 |
|---|---|---|
name | string | セーブポイント名 |
戻り値: boolean, error
tx:release
Section titled “tx:release”セーブポイントを解放。
local ok, err = tx:release("sp1")| パラメータ | 型 | 説明 |
|---|---|---|
name | string | セーブポイント名 |
戻り値: boolean, error
SELECTビルダー
Section titled “SELECTビルダー”SELECTクエリを構築するための流暢なインターフェース。
select:from
Section titled “select:from”FROM句を設定。
local query = sql.builder.select("id", "name"):from("users")| パラメータ | 型 | 説明 |
|---|---|---|
table | string | テーブル名 |
戻り値: SelectBuilder
select:join
Section titled “select:join”JOIN句を追加。
local query = sql.builder.select("*") :from("users") :join("orders ON orders.user_id = users.id")| パラメータ | 型 | 説明 |
|---|---|---|
join | string | ?プレースホルダー付きJOIN句 |
args | …any | バインド引数(オプション) |
戻り値: SelectBuilder
select:left_join
Section titled “select:left_join”LEFT JOIN句を追加。
local query = sql.builder.select("*") :from("users") :left_join("orders ON orders.user_id = users.id")| パラメータ | 型 | 説明 |
|---|---|---|
join | string | ?プレースホルダー付きJOIN句 |
args | …any | バインド引数(オプション) |
戻り値: SelectBuilder
select:right_join
Section titled “select:right_join”RIGHT JOIN句を追加。
local query = sql.builder.select("*") :from("users") :right_join("orders ON orders.user_id = users.id")| パラメータ | 型 | 説明 |
|---|---|---|
join | string | ?プレースホルダー付きJOIN句 |
args | …any | バインド引数(オプション) |
戻り値: SelectBuilder
select:inner_join
Section titled “select:inner_join”INNER JOIN句を追加。
local query = sql.builder.select("*") :from("users") :inner_join("orders ON orders.user_id = users.id")| パラメータ | 型 | 説明 |
|---|---|---|
join | string | ?プレースホルダー付きJOIN句 |
args | …any | バインド引数(オプション) |
戻り値: SelectBuilder
select:where
Section titled “select:where”WHERE条件を追加。
local query = sql.builder.select("*") :from("users") :where({active = 1})| パラメータ | 型 | 説明 |
|---|---|---|
condition | string|table|Sqlizer | WHERE条件 |
args | …any | バインド引数(オプション、文字列使用時) |
3つの形式をサポート:
- 文字列:
where("status = ?", "active") - テーブル:
where({status = "active"}) - Sqlizer:
where(sql.builder.gt({score = 80}))
戻り値: SelectBuilder
select:order_by
Section titled “select:order_by”ORDER BY句を追加。
local query = sql.builder.select("*") :from("users") :order_by("name ASC", "created_at DESC")| パラメータ | 型 | 説明 |
|---|---|---|
columns | …string | オプションのASC/DESC付きカラム名 |
戻り値: SelectBuilder
select:group_by
Section titled “select:group_by”GROUP BY句を追加。
local query = sql.builder.select("status", "COUNT(*)") :from("users") :group_by("status")| パラメータ | 型 | 説明 |
|---|---|---|
columns | …string | カラム名 |
戻り値: SelectBuilder
select:having
Section titled “select:having”HAVING条件を追加。
local query = sql.builder.select("status", "COUNT(*) as cnt") :from("users") :group_by("status") :having(sql.builder.gt({cnt = 10}))| パラメータ | 型 | 説明 |
|---|---|---|
condition | string|table|Sqlizer | HAVING条件 |
args | …any | バインド引数(オプション、文字列使用時) |
戻り値: SelectBuilder
select:limit
Section titled “select:limit”LIMITを設定。
local query = sql.builder.select("*") :from("users") :limit(10)| パラメータ | 型 | 説明 |
|---|---|---|
n | integer | リミット値 |
戻り値: SelectBuilder
select:offset
Section titled “select:offset”OFFSETを設定。
local query = sql.builder.select("*") :from("users") :offset(20)| パラメータ | 型 | 説明 |
|---|---|---|
n | integer | オフセット値 |
戻り値: SelectBuilder
select:columns
Section titled “select:columns”SELECTにカラムを追加。
local query = sql.builder.select():columns("id", "name", "email")| パラメータ | 型 | 説明 |
|---|---|---|
columns | …string | カラム名 |
戻り値: SelectBuilder
select:distinct
Section titled “select:distinct”DISTINCT修飾子を追加。
local query = sql.builder.select("status") :from("users") :distinct()戻り値: SelectBuilder
select:suffix
Section titled “select:suffix”SQLサフィックスを追加。
local query = sql.builder.select("*") :from("users") :suffix("FOR UPDATE")| パラメータ | 型 | 説明 |
|---|---|---|
sql | string | ?プレースホルダー付きSQLサフィックス |
args | …any | バインド引数(オプション) |
戻り値: SelectBuilder
select:placeholder_format
Section titled “select:placeholder_format”プレースホルダーフォーマットを設定。
local query = sql.builder.select("*") :from("users") :placeholder_format(sql.builder.dollar)| パラメータ | 型 | 説明 |
|---|---|---|
format | userdata | プレースホルダーフォーマット(sql.builder.*) |
戻り値: SelectBuilder
select:to_sql
Section titled “select:to_sql”SQL文字列とバインド引数を生成。
local sql_str, args = query:to_sql()戻り値: string, table
select:run_with
Section titled “select:run_with”クエリ用のエグゼキュータを作成。
local executor = query:run_with(db)local rows, err = executor:query()| パラメータ | 型 | 説明 |
|---|---|---|
db | DB|Transaction | データベースまたはトランザクションハンドル |
戻り値: QueryExecutor
INSERTビルダー
Section titled “INSERTビルダー”INSERTクエリを構築するための流暢なインターフェース。
insert:into
Section titled “insert:into”テーブル名を設定。
local query = sql.builder.insert():into("users")| パラメータ | 型 | 説明 |
|---|---|---|
table | string | テーブル名 |
戻り値: InsertBuilder
insert:columns
Section titled “insert:columns”カラム名を設定。
local query = sql.builder.insert("users"):columns("name", "email")| パラメータ | 型 | 説明 |
|---|---|---|
columns | …string | カラム名 |
戻り値: InsertBuilder
insert:values
Section titled “insert:values”行の値を追加。
local query = sql.builder.insert("users") :columns("name", "email") :values("alice", "alice@example.com")| パラメータ | 型 | 説明 |
|---|---|---|
values | …any | 行の値 |
戻り値: InsertBuilder
insert:set_map
Section titled “insert:set_map”テーブルからカラムと値を設定。
local query = sql.builder.insert("users") :set_map({name = "alice", email = "alice@example.com"})| パラメータ | 型 | 説明 |
|---|---|---|
map | table | {column = value}ペア |
戻り値: InsertBuilder
insert:select
Section titled “insert:select”SELECTクエリから挿入。
local select_query = sql.builder.select("name", "email"):from("temp_users")local query = sql.builder.insert("users") :columns("name", "email") :select(select_query)| パラメータ | 型 | 説明 |
|---|---|---|
query | SelectBuilder | SELECTクエリ |
戻り値: InsertBuilder
insert:prefix
Section titled “insert:prefix”SQLプレフィックスを追加。
local query = sql.builder.insert("users") :prefix("INSERT IGNORE INTO")| パラメータ | 型 | 説明 |
|---|---|---|
sql | string | ?プレースホルダー付きSQLプレフィックス |
args | …any | バインド引数(オプション) |
戻り値: InsertBuilder
insert:suffix
Section titled “insert:suffix”SQLサフィックスを追加。
local query = sql.builder.insert("users") :columns("name") :values("alice") :suffix("RETURNING id")| パラメータ | 型 | 説明 |
|---|---|---|
sql | string | ?プレースホルダー付きSQLサフィックス |
args | …any | バインド引数(オプション) |
戻り値: InsertBuilder
insert:options
Section titled “insert:options”INSERTオプションを追加。
local query = sql.builder.insert("users") :options("DELAYED", "IGNORE")| パラメータ | 型 | 説明 |
|---|---|---|
options | …string | INSERTオプション |
戻り値: InsertBuilder
insert:placeholder_format
Section titled “insert:placeholder_format”プレースホルダーフォーマットを設定。
local query = sql.builder.insert("users") :placeholder_format(sql.builder.dollar)| パラメータ | 型 | 説明 |
|---|---|---|
format | userdata | プレースホルダーフォーマット(sql.builder.*) |
戻り値: InsertBuilder
insert:to_sql
Section titled “insert:to_sql”SQL文字列とバインド引数を生成。
local sql_str, args = query:to_sql()戻り値: string, table
insert:run_with
Section titled “insert:run_with”クエリ用のエグゼキュータを作成。
local executor = query:run_with(db)local result, err = executor:exec()| パラメータ | 型 | 説明 |
|---|---|---|
db | DB|Transaction | データベースまたはトランザクションハンドル |
戻り値: QueryExecutor
UPDATEビルダー
Section titled “UPDATEビルダー”UPDATEクエリを構築するための流暢なインターフェース。
update:table
Section titled “update:table”テーブル名を設定。
local query = sql.builder.update():table("users")| パラメータ | 型 | 説明 |
|---|---|---|
table | string | テーブル名 |
戻り値: UpdateBuilder
update:set
Section titled “update:set”カラム値を設定。
local query = sql.builder.update("users") :set("status", "active") :set("updated_at", sql.builder.expr("NOW()"))| パラメータ | 型 | 説明 |
|---|---|---|
column | string | カラム名 |
value | any | カラム値 |
戻り値: UpdateBuilder
update:set_map
Section titled “update:set_map”テーブルから複数のカラムを設定。
local query = sql.builder.update("users") :set_map({status = "active", updated_at = sql.builder.expr("NOW()")})| パラメータ | 型 | 説明 |
|---|---|---|
map | table | {column = value}ペア |
戻り値: UpdateBuilder
update:where
Section titled “update:where”WHERE条件を追加。
local query = sql.builder.update("users") :set("status", "active") :where({id = 123})| パラメータ | 型 | 説明 |
|---|---|---|
condition | string|table|Sqlizer | WHERE条件 |
args | …any | バインド引数(オプション、文字列使用時) |
戻り値: UpdateBuilder
update:order_by
Section titled “update:order_by”ORDER BY句を追加。
local query = sql.builder.update("users") :set("rank", 1) :order_by("score DESC")| パラメータ | 型 | 説明 |
|---|---|---|
columns | …string | オプションのASC/DESC付きカラム名 |
戻り値: UpdateBuilder
update:limit
Section titled “update:limit”LIMITを設定。
local query = sql.builder.update("users") :set("status", "active") :limit(10)| パラメータ | 型 | 説明 |
|---|---|---|
n | integer | リミット値 |
戻り値: UpdateBuilder
update:offset
Section titled “update:offset”OFFSETを設定。
local query = sql.builder.update("users") :set("status", "active") :offset(5)| パラメータ | 型 | 説明 |
|---|---|---|
n | integer | オフセット値 |
戻り値: UpdateBuilder
update:suffix
Section titled “update:suffix”SQLサフィックスを追加。
local query = sql.builder.update("users") :set("status", "active") :suffix("RETURNING id")| パラメータ | 型 | 説明 |
|---|---|---|
sql | string | ?プレースホルダー付きSQLサフィックス |
args | …any | バインド引数(オプション) |
戻り値: UpdateBuilder
update:from
Section titled “update:from”FROM句を追加。
local query = sql.builder.update("users") :set("status", "active") :from("other_table")| パラメータ | 型 | 説明 |
|---|---|---|
table | string | テーブル名 |
戻り値: UpdateBuilder
update:from_select
Section titled “update:from_select”SELECTクエリから更新。
local select_query = sql.builder.select("*"):from("temp_users")local query = sql.builder.update("users") :set("status", "active") :from_select(select_query, "t")| パラメータ | 型 | 説明 |
|---|---|---|
query | SelectBuilder | SELECTクエリ |
alias | string | テーブルエイリアス |
戻り値: UpdateBuilder
update:placeholder_format
Section titled “update:placeholder_format”プレースホルダーフォーマットを設定。
local query = sql.builder.update("users") :placeholder_format(sql.builder.dollar)| パラメータ | 型 | 説明 |
|---|---|---|
format | userdata | プレースホルダーフォーマット(sql.builder.*) |
戻り値: UpdateBuilder
update:to_sql
Section titled “update:to_sql”SQL文字列とバインド引数を生成。
local sql_str, args = query:to_sql()戻り値: string, table
update:run_with
Section titled “update:run_with”クエリ用のエグゼキュータを作成。
local executor = query:run_with(db)local result, err = executor:exec()| パラメータ | 型 | 説明 |
|---|---|---|
db | DB|Transaction | データベースまたはトランザクションハンドル |
戻り値: QueryExecutor
DELETEビルダー
Section titled “DELETEビルダー”DELETEクエリを構築するための流暢なインターフェース。
delete:from
Section titled “delete:from”テーブル名を設定。
local query = sql.builder.delete():from("users")| パラメータ | 型 | 説明 |
|---|---|---|
table | string | テーブル名 |
戻り値: DeleteBuilder
delete:where
Section titled “delete:where”WHERE条件を追加。
local query = sql.builder.delete("users") :where({active = 0})| パラメータ | 型 | 説明 |
|---|---|---|
condition | string|table|Sqlizer | WHERE条件 |
args | …any | バインド引数(オプション、文字列使用時) |
戻り値: DeleteBuilder
delete:order_by
Section titled “delete:order_by”ORDER BY句を追加。
local query = sql.builder.delete("users") :where({active = 0}) :order_by("created_at ASC")| パラメータ | 型 | 説明 |
|---|---|---|
columns | …string | オプションのASC/DESC付きカラム名 |
戻り値: DeleteBuilder
delete:limit
Section titled “delete:limit”LIMITを設定。
local query = sql.builder.delete("users") :where({active = 0}) :limit(100)| パラメータ | 型 | 説明 |
|---|---|---|
n | integer | リミット値 |
戻り値: DeleteBuilder
delete:offset
Section titled “delete:offset”OFFSETを設定。
local query = sql.builder.delete("users") :where({active = 0}) :offset(10)| パラメータ | 型 | 説明 |
|---|---|---|
n | integer | オフセット値 |
戻り値: DeleteBuilder
delete:suffix
Section titled “delete:suffix”SQLサフィックスを追加。
local query = sql.builder.delete("users") :where({active = 0}) :suffix("RETURNING id")| パラメータ | 型 | 説明 |
|---|---|---|
sql | string | ?プレースホルダー付きSQLサフィックス |
args | …any | バインド引数(オプション) |
戻り値: DeleteBuilder
delete:placeholder_format
Section titled “delete:placeholder_format”プレースホルダーフォーマットを設定。
local query = sql.builder.delete("users") :placeholder_format(sql.builder.dollar)| パラメータ | 型 | 説明 |
|---|---|---|
format | userdata | プレースホルダーフォーマット(sql.builder.*) |
戻り値: DeleteBuilder
delete:to_sql
Section titled “delete:to_sql”SQL文字列とバインド引数を生成。
local sql_str, args = query:to_sql()戻り値: string, table
delete:run_with
Section titled “delete:run_with”クエリ用のエグゼキュータを作成。
local executor = query:run_with(db)local result, err = executor:exec()| パラメータ | 型 | 説明 |
|---|---|---|
db | DB|Transaction | データベースまたはトランザクションハンドル |
戻り値: QueryExecutor
クエリの実行
Section titled “クエリの実行”クエリエグゼキュータはビルダーが生成したクエリを実行。
executor:query
Section titled “executor:query”クエリを実行し行を返す(SELECT用)。
local rows, err = executor:query()戻り値: table[], error
executor:exec
Section titled “executor:exec”クエリを実行し結果を返す(INSERT/UPDATE/DELETE用)。
local result, err = executor:exec()戻り値: table, error
フィールド付きテーブルを返す:
last_insert_id- 最後に挿入されたIDrows_affected- 影響を受けた行数
executor:to_sql
Section titled “executor:to_sql”実行せずに生成されたSQLと引数を返す。
local sql_str, args = executor:to_sql()戻り値: string, table
データベースアクセスはセキュリティポリシー評価の対象。
| アクション | リソース | 説明 |
|---|---|---|
db.get | Database ID | データベース接続を取得 |
| 条件 | 種別 | 再試行可能 |
|---|---|---|
| リソースIDが空 | errors.INVALID | no |
| 権限拒否 | errors.PERMISSION_DENIED | no |
| リソースが見つからない | errors.NOT_FOUND | no |
| リソースがデータベースではない | errors.INVALID | no |
| 無効なパラメータ | errors.INVALID | no |
| SQL構文エラー | errors.INVALID | no |
| ステートメントがクローズ済み | errors.INVALID | no |
| トランザクションがアクティブでない | errors.INVALID | no |
| 無効なセーブポイント名 | errors.INVALID | no |
| クエリ実行エラー | 様々 | 様々 |
エラーの処理についてはエラー処理を参照。
local sql = require("sql")
-- データベース接続を取得local db, err = sql.get("app.db:main")if err then error(err) end
-- データベースタイプを確認local dbtype, _ = db:type()print("Database type:", dbtype)
-- 直接クエリ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
-- ビルダーパターン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
-- セーブポイント付きトランザクション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
-- プリペアドステートメント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) endend
stmt:close()
-- NULLと型付き値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()