概要
nimのデータベース操作をコツコツと。
以下メモ
# 基本操作
import db_sqlite
block:
let db = open("mydb.db","user","password","dbname")
let ddl = @[
sql"""drop table work""",
sql"""create table work (id integer,name varchar(50) not null)"""
]
defer:
echo "db closed"
db.close()
# DDLを実行
for cmd in ddl :
discard db.tryExec(cmd)
# レコードを挿入
db.exec(sql"BEGIN")
db.exec(sql"insert into work values(?,?)",1,"Mr.スポック" )
db.exec(sql"insert into work values(?,?)",["2","Mr.ビーン"] )
db.exec(sql"insert into work values(?,?)",@["3","Mr.サタン"] )
db.exec(sql"COMMIT")
# セレクトする
for x in db.fastRows(sql"select id,name from work order by id desc") :
echo x
(stdout)
@[3, Mr.サタン]
@[2, Mr.ビーン]
@[1, Mr.スポック]
db closed
# 基本操作(autoincrementを追加)
import db_sqlite
block:
let db = open("mydb.db","user","password","dbname")
let ddl = @[
sql"""drop table work""",
sql"""create table work (id integer primary key autoincrement,name varchar(50) not null)"""
]
defer:
echo "db closed"
db.close()
# DDLを実行
for cmd in ddl :
discard db.tryExec(cmd)
# レコードを挿入
db.exec(sql"BEGIN")
# 追加したれコードに自動採番された値を取り出す
echo "追加されたID=",db.tryInsertID(sql"insert into work(name) values(?)","Mr.スポック" )
echo "追加されたID=",db.tryInsertID(sql"insert into work(name) values(?)","Mr.ビーン" )
echo "追加されたID=",db.tryInsertID(sql"insert into work(name) values(?)","Mr.サタン" )
echo "更新された行=",db.execAffectedRows(sql"update work set name=? where id=?","Mr.ホームズ",3)
db.exec(sql"COMMIT")
# セレクトする
for x in db.fastRows(sql"select id,name from work order by id") :
echo x
(stdout)
追加されたID=1
追加されたID=2
追加されたID=3
更新された行=1
@[1, Mr.スポック]
@[2, Mr.ビーン]
@[3, Mr.ホームズ]
db closed
# イテレータテスト
import db_sqlite
block:
let db = open("mydb.db","user","password","dbname")
defer:
echo "db closed"
db.close()
# 爆速セレクトただしぶっ壊れやすいので、すべて取り出すときに利用してね的な事がドキュメントに書いてありました
for x in db.fastRows(sql"select id,name from work order by id") :
echo "fastRows=>",x[0],"/",x[1]
# 動きはfastRowsと一緒だけど遅いです。でも安全。
for x in db.rows(sql"select id,name from work order by id") :
echo "rows=>",x[0],"/",x[1]
# fastROwsとrowsの中間くらい?返却するのは、InstantRow型のオブジェクトでインデクスでアクセス
for x in db.instantRows(sql"select id,name from work order by id") :
echo "instantROws=>",x[0],"/",x[1]
(stdout)
fastRows=>1/Mr.スポック
fastRows=>2/Mr.ビーン
fastRows=>3/Mr.ホームズ
rows=>1/Mr.スポック
rows=>2/Mr.ビーン
rows=>3/Mr.ホームズ
instantROws=>1/Mr.スポック
instantROws=>2/Mr.ビーン
instantROws=>3/Mr.ホームズ
db closed