LoginSignup
5
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-06-04

概要

nimのデータベース操作をコツコツと。
sqliteとほぼ変わりません。

以下メモ

# 基本操作

import db_postgres
block:
  let db = open("127.0.0.1:5432","nim","nim","sample")
  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

# 基本操作(serialを追加)

import db_postgres
block:
  let db = open("127.0.0.1:5432","nim","nim","sample")
  let ddl = @[
    sql"""drop table work""",
    sql"""create table work (id serial,name varchar(50) not null,primary key(id))"""
  ]
  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_postgres
block:
  let db = open("127.0.0.1:5432","nim","nim","sample")
  defer:
    echo "db closed"
    db.close()
  # プリペアドステートメント
  let preparedSql = db.prepare("select1",sql"select id,name from work order by id",0)
  # 爆速セレクトただしぶっ壊れやすいので、すべて取り出すときに利用してね的な事がドキュメントに書いてありました
  for x in db.fastRows(preparedSql) :
    echo "fastRows=>",x[0],"/",x[1]
  # 動きはfastRowsと一緒だけど遅いです。でも安全。
  for x in db.rows(preparedSql) :
    echo "rows=>",x[0],"/",x[1]
  # instantRowsだが、インデクスで取れない・・・バグ?
  for x in db.instantRows(preparedSql) :
    echo "instantRows=>",x.len
  # こちらはイテレータではなく、すべての行を取り出す
  for x in db.getAllRows(preparedSql) :
    echo "getAllRows=>",x[0],"/",x[1]
(stdout)
fastRows=>1/Mr.スポック
fastRows=>2/Mr.ビーン
fastRows=>3/Mr.ホームズ
rows=>1/Mr.スポック
rows=>2/Mr.ビーン
rows=>3/Mr.ホームズ
instantRows=>2
instantRows=>2
instantRows=>2
getAllRows=>1/Mr.スポック
getAllRows=>2/Mr.ビーン
getAllRows=>3/Mr.ホームズ
db closed
5
2
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
5
2