LoginSignup
12
6

More than 5 years have passed since last update.

nimデータベース操作(sqlite)

Last updated at Posted at 2016-06-01

概要

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
12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6