Help us understand the problem. What is going on with this article?

プログラミング言語でSQLite始め

SQLの経験がほぼない状態だけど、
Node.js、C#、Python3、HSP3でのSQLiteの扱い方を学んだ。
(一応SQL文のみでの動作も)

Node.jsはなんとなくTypeScriptで書いているので、各自動かす場合は型表記を削除すること。
(多分まとめのPromiseだけ)

実行環境

  • Windows10 64bit
  • Sqlite 3.33.0 2020-08-14
  • TypeScript Version 4.0.3
  • Node.js v12.18.4
  • .NET Core 3.1.402
  • Python 3.8.3
  • HSP : Hot Soup Processor ver3.5

使用ライブラリ

Node.js

node-sqlite3
下記でインストール。

> npm i sqlite3

C#

Microsoft.Data.Sqlite

> dotnet add package Microsoft.Data.Sqlite

System.Data.SQLiteとは派生の関係にあり、大よそのAPI機能は一致していそう。

Python

sqlite3
標準ライブラリなので追加インストール不要。

HSP

sqlele
標準ライブラリなので追加インストール不要。

データベースの初期化

データベースを開いて、
テーブルがなければテーブルを作って(CREATE)、
アイテムを追加して(INSERT)、
データベースを閉じる。

「ID」列は自動採番(AUTOINCREMENT)を設定。

SQL

コマンド
> sqlite3 sqlitest.db < sqlitest.sql
CREATE TABLE IF NOT EXISTS DMCARDS (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    NAME TEXT,
    COLOR TEXT,
    COST INTEGER,
    POWER INTEGER
);

INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ラ・ウラ・ギガ','光',1,2000)
INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('アクア・ガード','水',1,2000)
INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ボーン・スライム','闇',1,1000)
INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ブレイズ・クロー','火',1,1000)
INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('スナイプ・モスキート','自然',1,2000)

Node.js

const sqlite=require("sqlite3");

var db=new sqlite.Database("../sqlitest.db",err=>{
    db.serialize(()=>{
        db.run(`CREATE TABLE IF NOT EXISTS DMCARDS (
            ID INTEGER PRIMARY KEY AUTOINCREMENT,
            NAME TEXT,COLOR TEXT,
            COST INTEGER,
            POWER INTEGER
        )`);

        db.run("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ラ・ウラ・ギガ','光',1,2000)");
        db.run("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('アクア・ガード','水',1,2000)");
        db.run("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ボーン・スライム','闇',1,1000)");
        db.run("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ブレイズ・クロー','火',1,1000)");
        db.run("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('スナイプ・モスキート','自然',1,2000)");

        db.close();
    });
});

C#

using System;
using Microsoft.Data.Sqlite;

class Program{
    static void Main(){
        using(var db=new SqliteConnection("Data Source=../sqlitest.db")){
            db.Open();
            var sql=db.CreateCommand();

            sql.CommandText=@"CREATE TABLE IF NOT EXISTS DMCARDS (
                ID INTEGER PRIMARY KEY AUTOINCREMENT,
                NAME TEXT,
                COLOR TEXT,
                COST INTEGER,
                POWER INTEGER
            )";
            sql.ExecuteNonQuery();

            sql.CommandText="INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ラ・ウラ・ギガ','光',1,2000)";
            sql.ExecuteNonQuery();
            sql.CommandText="INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('アクア・ガード','水',1,2000)";
            sql.ExecuteNonQuery();
            sql.CommandText="INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ボーン・スライム','闇',1,1000)";
            sql.ExecuteNonQuery();
            sql.CommandText="INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ブレイズ・クロー','火',1,1000)";
            sql.ExecuteNonQuery();
            sql.CommandText="INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('スナイプ・モスキート','自然',1,2000)";
            sql.ExecuteNonQuery();
        }
    }
}

Python

import sqlite3

with sqlite3.connect("../sqlitest.db") as db:
    db.row_factory=sqlite3.Row
    sql=db.cursor()

    sql.execute("""CREATE TABLE IF NOT EXISTS DMCARDS (
        ID INTEGER PRIMARY KEY AUTOINCREMENT,
        NAME TEXT,COLOR TEXT,
        COST INTEGER,
        POWER INTEGER
    )""")

    sql.execute("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ラ・ウラ・ギガ','光',1,2000)")
    sql.execute("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('アクア・ガード','水',1,2000)")
    sql.execute("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ボーン・スライム','闇',1,1000)")
    sql.execute("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ブレイズ・クロー','火',1,1000)")
    sql.execute("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('スナイプ・モスキート','自然',1,2000)")

HSP

#runtime "hsp3cl"
#include "sqlele.hsp"

sql_open "../sqlitest.db"

makeTable={"CREATE TABLE IF NOT EXISTS DMCARDS (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    NAME TEXT,COLOR TEXT,
    COST INTEGER,
    POWER INTEGER
)"}
sql_q makeTable

sql_q "INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ラ・ウラ・ギガ','光',1,2000)"
sql_q "INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('アクア・ガード','水',1,2000)"
sql_q "INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ボーン・スライム','闇',1,1000)"
sql_q "INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ブレイズ・クロー','火',1,1000)"
sql_q "INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('スナイプ・モスキート','自然',1,2000)"

sql_close

データベースの表示

データベースを開いて、
テーブルを全部表示して(SELECT)、
データベースを閉じる。

SQL

SELECT * FROM DMCARDS;

Node.js

const sqlite=require("sqlite3");

var db=new sqlite.Database("../sqlitest.db",err=>{
    db.serialize(()=>{
        console.log("ID,NAME,COLOR,COST,POWER");
        db.each("SELECT * FROM DMCARDS",(err,row)=>{
            console.log(`${row["ID"]},${row["NAME"]},${row["COLOR"]},${row["COST"]},${row["POWER"]}`);
        });

        db.close();
    });
});

C#

using System;
using Microsoft.Data.Sqlite;

class Program{
    static void Main(){
        using(var db=new SqliteConnection("Data Source=../sqlitest.db")){
            db.Open();
            var sql=db.CreateCommand();

            sql.CommandText="SELECT * FROM DMCARDS";
            using(var row=sql.ExecuteReader()){
                Console.WriteLine("ID,NAME,COLOR,COST,POWER");
                while(row.Read()){
                    Console.WriteLine($"{row["ID"]},{row["NAME"]},{row["COLOR"]},{row["COST"]},{row["POWER"]}");
                }
            }
        }
    }
}

Python

import sqlite3

with sqlite3.connect("../sqlitest.db") as db:
    db.row_factory=sqlite3.Row
    sql=db.cursor()

    print("ID,NAME,COLOR,COST,POWER")
    for row in sql.execute("SELECT * FROM DMCARDS"):
        print(f'{row["ID"]},{row["NAME"]},{row["COLOR"]},{row["COST"]},{row["POWER"]}')

HSP

#runtime "hsp3cl"
#include "sqlele.hsp"

sql_open "../sqlitest.db"

mes "ID,NAME,COLOR,COST,POWER"
sdim rows
sql_q "SELECT * FROM DMCARDS",rows
repeat stat
    mes sql_v("ID",rows)+","+sql_v("NAME",rows)+","+sql_v("COLOR",rows)+","+sql_i("COST",rows)+","+sql_i("POWER",rows)
    sql_next rows
loop

sql_close

テータベースの変更

データベースを開いて、
テーブルを変更して(UPDATE)、
データベースを閉じる。

SQL

UPDATE DMCARDS SET COLOR='白' WHERE COLOR='光';
UPDATE DMCARDS SET COLOR='青' WHERE COLOR='水';
UPDATE DMCARDS SET COLOR='黒' WHERE COLOR='闇';
UPDATE DMCARDS SET COLOR='赤' WHERE COLOR='火';
UPDATE DMCARDS SET COLOR='緑' WHERE COLOR='自然';

Node.js

const sqlite=require("sqlite3");

var db=new sqlite.Database("../sqlitest.db",err=>{
    db.serialize(()=>{
        db.run("UPDATE DMCARDS SET COLOR='白' WHERE COLOR='光'");
        db.run("UPDATE DMCARDS SET COLOR='青' WHERE COLOR='水'");
        db.run("UPDATE DMCARDS SET COLOR='黒' WHERE COLOR='闇'");
        db.run("UPDATE DMCARDS SET COLOR='赤' WHERE COLOR='火'");
        db.run("UPDATE DMCARDS SET COLOR='緑' WHERE COLOR='自然'");

        db.close();
    });
});

 

C#

using System;
using Microsoft.Data.Sqlite;

class Program{
    static void Main(){
        using(var db=new SqliteConnection("Data Source=../sqlitest.db")){
            db.Open();
            var sql=db.CreateCommand();

            sql.CommandText="UPDATE DMCARDS SET COLOR='白' WHERE COLOR='光'";
            sql.ExecuteNonQuery();
            sql.CommandText="UPDATE DMCARDS SET COLOR='青' WHERE COLOR='水'";
            sql.ExecuteNonQuery();
            sql.CommandText="UPDATE DMCARDS SET COLOR='黒' WHERE COLOR='闇'";
            sql.ExecuteNonQuery();
            sql.CommandText="UPDATE DMCARDS SET COLOR='赤' WHERE COLOR='赤'";
            sql.ExecuteNonQuery();
            sql.CommandText="UPDATE DMCARDS SET COLOR='緑' WHERE COLOR='自然'";
            sql.ExecuteNonQuery();
        }
    }
}

Python

import sqlite3

with sqlite3.connect("../sqlitest.db") as db:
    db.row_factory=sqlite3.Row
    sql=db.cursor()

    sql.execute("UPDATE DMCARDS SET COLOR='白' WHERE COLOR='光'")
    sql.execute("UPDATE DMCARDS SET COLOR='青' WHERE COLOR='水'")
    sql.execute("UPDATE DMCARDS SET COLOR='黒' WHERE COLOR='闇'")
    sql.execute("UPDATE DMCARDS SET COLOR='赤' WHERE COLOR='火'")
    sql.execute("UPDATE DMCARDS SET COLOR='緑' WHERE COLOR='自然'")

HSP

#runtime "hsp3cl"
#include "sqlele.hsp"

sql_open "../sqlitest.db"

sql_q "UPDATE DMCARDS SET COLOR='白' WHERE COLOR='光'"
sql_q "UPDATE DMCARDS SET COLOR='青' WHERE COLOR='水'"
sql_q "UPDATE DMCARDS SET COLOR='黒' WHERE COLOR='闇'"
sql_q "UPDATE DMCARDS SET COLOR='赤' WHERE COLOR='火'"
sql_q "UPDATE DMCARDS SET COLOR='緑' WHERE COLOR='自然'"

sql_close

データベースの削除

データベースを開いて、
テーブルが存在すればテーブルを破壊して(DROP)、
データベースを閉じる。

SQL

DROP TABLE IF EXISTS DMCARDS;

Node.js

const sqlite=require("sqlite3");

var db=new sqlite.Database("../sqlitest.db",err=>{
    db.serialize(()=>{
        db.run("DROP TABLE IF EXISTS DMCARDS");

        db.close();
    });
});

 

C#

using System;
using Microsoft.Data.Sqlite;

class Program{
    static void Main(){
        using(var db=new SqliteConnection("Data Source=../sqlitest.db")){
            db.Open();
            var sql=db.CreateCommand();

            sql.CommandText="DROP TABLE IF EXISTS DMCARDS";
            sql.ExecuteNonQuery();
        }
    }
}

Python

import sqlite3

with sqlite3.connect("../sqlitest.db") as db:
    db.row_factory=sqlite3.Row
    sql=db.cursor()

    sql.execute("DROP TABLE IF EXISTS DMCARDS")

HSP

#runtime "hsp3cl"
#include "sqlele.hsp"

sql_open "../sqlitest.db"

sql_q "DROP TABLE IF EXISTS DMCARDS"

sql_close

データベース操作まとめ

関数化してここまでのデータベース操作をまとめた。
(SQL文除く。SQLiteでは関数を使えない?)

SQL

--データベースを削除
DROP TABLE IF EXISTS DMCARDS;

--データベース(テーブル)を初期化
CREATE TABLE IF NOT EXISTS DMCARDS (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    NAME TEXT,COLOR TEXT,
    COST INTEGER,
    POWER INTEGER
);
INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ラ・ウラ・ギガ','光',1,2000);
INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('アクア・ガード','水',1,2000);
INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ボーン・スライム','闇',1,1000);
INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ブレイズ・クロー','火',1,1000);
INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('スナイプ・モスキート','自然',1,2000);

--データベースを表示
SELECT * FROM DMCARDS;
SELECT '--------------------------------------';

--データベースを変更
UPDATE DMCARDS SET COLOR='白' WHERE COLOR='光';
UPDATE DMCARDS SET COLOR='青' WHERE COLOR='水';
UPDATE DMCARDS SET COLOR='黒' WHERE COLOR='闇';
UPDATE DMCARDS SET COLOR='赤' WHERE COLOR='火';
UPDATE DMCARDS SET COLOR='緑' WHERE COLOR='自然';

--データベースを表示
SELECT * FROM DMCARDS;

Node.js

const sqlite=require("sqlite3");

//データベース(テーブル)を初期化
function makeDB():Promise<void>{
    return new Promise(resolve=>{
        var db=new sqlite.Database("../sqlitest.db",err=>{
            db.serialize(()=>{
                db.run(`CREATE TABLE IF NOT EXISTS DMCARDS (
                    ID INTEGER PRIMARY KEY AUTOINCREMENT,
                    NAME TEXT,COLOR TEXT,
                    COST INTEGER,
                    POWER INTEGER
                )`);

                db.run("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ラ・ウラ・ギガ','光',1,2000)");
                db.run("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('アクア・ガード','水',1,2000)");
                db.run("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ボーン・スライム','闇',1,1000)");
                db.run("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ブレイズ・クロー','火',1,1000)");
                db.run("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('スナイプ・モスキート','自然',1,2000)");

                db.close(resolve);
            });
        });
    });
}

//データベースを更新
function updateDB():Promise<void>{
    return new Promise(resolve=>{
        var db=new sqlite.Database("../sqlitest.db",err=>{
            db.serialize(()=>{
                db.run("UPDATE DMCARDS SET COLOR='白' WHERE COLOR='光'");
                db.run("UPDATE DMCARDS SET COLOR='青' WHERE COLOR='水'");
                db.run("UPDATE DMCARDS SET COLOR='黒' WHERE COLOR='闇'");
                db.run("UPDATE DMCARDS SET COLOR='赤' WHERE COLOR='火'");
                db.run("UPDATE DMCARDS SET COLOR='緑' WHERE COLOR='自然'");

                db.close(resolve);
            });
        });
    });
}

//データベースを削除
function dropDB():Promise<void>{
    return new Promise(resolve=>{
        var db=new sqlite.Database("../sqlitest.db",err=>{
            db.serialize(()=>{
                db.run("DROP TABLE IF EXISTS DMCARDS");

                db.close(resolve);
            });
        });
    });
}

//データベースを変更
function viewDB():Promise<void>{
    return new Promise(resolve=>{
        var db=new sqlite.Database("../sqlitest.db",err=>{
            db.serialize(()=>{
                console.log("ID,NAME,COLOR,COST,POWER");
                db.each("SELECT * FROM DMCARDS",(err,row)=>{
                    console.log(`${row["ID"]},${row["NAME"]},${row["COLOR"]},${row["COST"]},${row["POWER"]}`);
                });

                db.close(resolve);
            });
        });
    });
}

(async function(){
    await dropDB();
    await makeDB();
    await viewDB();
    await updateDB();
    await viewDB();
})();

 

C#

using System;
using Microsoft.Data.Sqlite;

class Program{
    //データベース(テーブル)を初期化
    static void makeDB(){
        using(var db=new SqliteConnection("Data Source=../sqlitest.db")){
            db.Open();
            var sql=db.CreateCommand();

            sql.CommandText=@"CREATE TABLE IF NOT EXISTS DMCARDS (
                ID INTEGER PRIMARY KEY AUTOINCREMENT,
                NAME TEXT,
                COLOR TEXT,
                COST INTEGER,
                POWER INTEGER
            )";
            sql.ExecuteNonQuery();

            sql.CommandText="INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ラ・ウラ・ギガ','光',1,2000)";
            sql.ExecuteNonQuery();
            sql.CommandText="INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('アクア・ガード','水',1,2000)";
            sql.ExecuteNonQuery();
            sql.CommandText="INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ボーン・スライム','闇',1,1000)";
            sql.ExecuteNonQuery();
            sql.CommandText="INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ブレイズ・クロー','火',1,1000)";
            sql.ExecuteNonQuery();
            sql.CommandText="INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('スナイプ・モスキート','自然',1,2000)";
            sql.ExecuteNonQuery();
        }
    }

    //データベースを変更
    static void updateDB(){
        using(var db=new SqliteConnection("Data Source=../sqlitest.db")){
            db.Open();
            var sql=db.CreateCommand();

            sql.CommandText="UPDATE DMCARDS SET COLOR='白' WHERE COLOR='光'";
            sql.ExecuteNonQuery();
            sql.CommandText="UPDATE DMCARDS SET COLOR='青' WHERE COLOR='水'";
            sql.ExecuteNonQuery();
            sql.CommandText="UPDATE DMCARDS SET COLOR='黒' WHERE COLOR='闇'";
            sql.ExecuteNonQuery();
            sql.CommandText="UPDATE DMCARDS SET COLOR='赤' WHERE COLOR='赤'";
            sql.ExecuteNonQuery();
            sql.CommandText="UPDATE DMCARDS SET COLOR='緑' WHERE COLOR='自然'";
            sql.ExecuteNonQuery();
        }
    }

    //データベースを削除
    static void dropDB(){
        using(var db=new SqliteConnection("Data Source=../sqlitest.db")){
            db.Open();
            var sql=db.CreateCommand();

            sql.CommandText="DROP TABLE IF EXISTS DMCARDS";
            sql.ExecuteNonQuery();
        }
    }

    //データベースを表示
    static void viewDB(){
        using(var db=new SqliteConnection("Data Source=../sqlitest.db")){
            db.Open();
            var sql=db.CreateCommand();

            sql.CommandText="SELECT * FROM DMCARDS";
            using(var row=sql.ExecuteReader()){
                Console.WriteLine("ID,NAME,COLOR,COST,POWER");
                while(row.Read()){
                    Console.WriteLine($"{row["ID"]},{row["NAME"]},{row["COLOR"]},{row["COST"]},{row["POWER"]}");
                }
            }
        }
    }

    static void Main(){
        dropDB();
        makeDB();
        viewDB();
        updateDB();
        viewDB();
    }
}

Python

import sqlite3

#データベース(テーブル)を初期化
def makeDB():
    with sqlite3.connect("../sqlitest.db") as db:
        db.row_factory=sqlite3.Row
        sql=db.cursor()

        sql.execute("""CREATE TABLE IF NOT EXISTS DMCARDS (
            ID INTEGER PRIMARY KEY AUTOINCREMENT,
            NAME TEXT,COLOR TEXT,
            COST INTEGER,
            POWER INTEGER
        )""")

        sql.execute("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ラ・ウラ・ギガ','光',1,2000)")
        sql.execute("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('アクア・ガード','水',1,2000)")
        sql.execute("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ボーン・スライム','闇',1,1000)")
        sql.execute("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ブレイズ・クロー','火',1,1000)")
        sql.execute("INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('スナイプ・モスキート','自然',1,2000)")

#データベースを変更
def updateDB():
    with sqlite3.connect("../sqlitest.db") as db:
        db.row_factory=sqlite3.Row
        sql=db.cursor()

        sql.execute("UPDATE DMCARDS SET COLOR='白' WHERE COLOR='光'")
        sql.execute("UPDATE DMCARDS SET COLOR='青' WHERE COLOR='水'")
        sql.execute("UPDATE DMCARDS SET COLOR='黒' WHERE COLOR='闇'")
        sql.execute("UPDATE DMCARDS SET COLOR='赤' WHERE COLOR='火'")
        sql.execute("UPDATE DMCARDS SET COLOR='緑' WHERE COLOR='自然'")

#データベースを削除
def dropDB():
    with sqlite3.connect("../sqlitest.db") as db:
        db.row_factory=sqlite3.Row
        sql=db.cursor()

        sql.execute("DROP TABLE IF EXISTS DMCARDS")

#データベースを表示
def viewDB():
    with sqlite3.connect("../sqlitest.db") as db:
        db.row_factory=sqlite3.Row
        sql=db.cursor()

        print("ID,NAME,COLOR,COST,POWER")
        for row in sql.execute("SELECT * FROM DMCARDS"):
            print(f'{row["ID"]},{row["NAME"]},{row["COLOR"]},{row["COST"]},{row["POWER"]}')

if __name__=="__main__":
    dropDB()
    makeDB()
    viewDB()
    updateDB()
    viewDB()

HSP

#runtime "hsp3cl"
#include "sqlele.hsp"

#module Program
    ;データベース(テーブル)を初期化
    #deffunc makeDB
        sql_open "../sqlitest.db"

        makeTable={"CREATE TABLE IF NOT EXISTS DMCARDS (
            ID INTEGER PRIMARY KEY AUTOINCREMENT,
            NAME TEXT,COLOR TEXT,
            COST INTEGER,
            POWER INTEGER
        )"}
        sql_q makeTable

        sql_q "INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ラ・ウラ・ギガ','光',1,2000)"
        sql_q "INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('アクア・ガード','水',1,2000)"
        sql_q "INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ボーン・スライム','闇',1,1000)"
        sql_q "INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('ブレイズ・クロー','火',1,1000)"
        sql_q "INSERT INTO DMCARDS (NAME,COLOR,COST,POWER) VALUES ('スナイプ・モスキート','自然',1,2000)"

        sql_close
    return

    ;データベースを変更
    #deffunc updateDB
        sql_open "../sqlitest.db"

        sql_q "UPDATE DMCARDS SET COLOR='白' WHERE COLOR='光'"
        sql_q "UPDATE DMCARDS SET COLOR='青' WHERE COLOR='水'"
        sql_q "UPDATE DMCARDS SET COLOR='黒' WHERE COLOR='闇'"
        sql_q "UPDATE DMCARDS SET COLOR='赤' WHERE COLOR='火'"
        sql_q "UPDATE DMCARDS SET COLOR='緑' WHERE COLOR='自然'"

        sql_close
    return

    ;データベースを削除
    #deffunc dropDB
        sql_open "../sqlitest.db"

        sql_q "DROP TABLE IF EXISTS DMCARDS"

        sql_close
    return

    ;データベースを表示
    #deffunc viewDB
        sql_open "../sqlitest.db"

        mes "ID,NAME,COLOR,COST,POWER"
        sdim rows
        sql_q "SELECT * FROM DMCARDS",rows
        repeat stat
            mes sql_v("ID",rows)+","+sql_v("NAME",rows)+","+sql_v("COLOR",rows)+","+sql_i("COST",rows)+","+sql_i("POWER",rows)
            sql_next rows
        loop

        sql_close
    return

    #deffunc main
        dropDB
        makeDB
        viewDB
        updateDB
        viewDB
    return
#global

main

感想とか補足

以上、SQLiteを試してみた結果でした。

INSERTとかUPDATEはループで注ぎ込んだ方が見栄えが綺麗な気がするけど、動作の確認が主なので今回はひたすら愚直に。
最後のまとめも関数毎にデータベース開いて閉じているのも意味はないはず。

言語に関する感想はライブラリの使用によるところが近い。多分。
特にSELECT文は返り値があるためライブラリの仕様の違いがよく目立つ。

SQL

普通の手続き型言語と全然書き方が違って慣れない…
if文があってfor文があって関数があってというのが、普通の言語だけどSQLでは違う考え方を要求されるのが難しい。

SQLにおけるSELECT文はprint文であり、foreach文のようである感じでよくわかってない。
多分、filterを掛けてmap処理してるのがイメージなのかな。

Node.js

非同期が最大の敵。
db.serialize()の外での取り扱いにしなければならない。
あとはdb.closeはdb.serialize()に突っ込んでも同期化されないっぽいので注意する。

おそらく、SELECT文専用だと思われるdb.each()は便利。
どこかでbreakできないので不便といわれているのも見たけれど。
(その時はdb.all()を使うといいみたい)

C#

とにかく冗長。
SQL文の入力と実行が必ず分離されるのがしんどい。
あとはSQLに値を与える方法としてパラメーターという方法があるけど、
かえって冗長になりそうだったので今回は使うのをやめた。

Python

かなり簡潔で書きやすいと思った。
SELECT文の返り値の処理だけは最初戸惑ったけど…
(普通にやってるとタプルが返ってくる
db.commit()はなぜか使わなくても大丈夫だった。

HSP

もしかしたら一番シンプル。
唯一オブジェクト指向でない言語なので同時に複数のデータベースを開くことができないのがおそらく難点。

SELECT文は受け取った値を自力でイテレーターを回す感じ。
(VBA,VBSのDir()とかが近いかもしれない)

あとは「#cmpopt init 1」を使うとコケるのでそれは注意。

yosgspec
JavaScript(Node.js,TypeScript),VB.NET,C#,CommonLisp,HSP,Python3,D,C++,VBA 等。 適当な言語マニアです。最近オブジェクト指向を覚えてから下手に多用することが多くなった。 その他に若干読み書きできる言語: Ruby,Lua,Java,Tcl,Scala,Scheme,Clojure,Go,Perl,Matlab,R 他
http://yosgspec.blog103.fc2.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away