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#
> dotnet add package Microsoft.Data.Sqlite
System.Data.SQLiteとは派生の関係にあり、大よそのAPI機能は一致していそう。
Python
sqlite3
標準ライブラリなので追加インストール不要。
HSP
sqlele
標準ライブラリなので追加インストール不要。
データベースの初期化
データベースを開いて、
テーブルがなければテーブルを作って(CREATE)、
アイテムを追加して(INSERT)、
データベースを閉じる。
「ID」列は自動採番(AUTOINCREMENT)を設定。
SQL
> sqlite3 sqlitest.db < sqlitest.sql
CREATETABLEIFNOTEXISTSDMCARDS(IDINTEGERPRIMARYKEYAUTOINCREMENT,NAMETEXT,COLORTEXT,COSTINTEGER,POWERINTEGER);INSERTINTODMCARDS(NAME,COLOR,COST,POWER)VALUES('ラ・ウラ・ギガ','光',1,2000)INSERTINTODMCARDS(NAME,COLOR,COST,POWER)VALUES('アクア・ガード','水',1,2000)INSERTINTODMCARDS(NAME,COLOR,COST,POWER)VALUES('ボーン・スライム','闇',1,1000)INSERTINTODMCARDS(NAME,COLOR,COST,POWER)VALUES('ブレイズ・クロー','火',1,1000)INSERTINTODMCARDS(NAME,COLOR,COST,POWER)VALUES('スナイプ・モスキート','自然',1,2000)
Node.js
constsqlite=require("sqlite3");vardb=newsqlite.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#
usingSystem;usingMicrosoft.Data.Sqlite;classProgram{staticvoidMain(){using(vardb=newSqliteConnection("Data Source=../sqlitest.db")){db.Open();varsql=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
importsqlite3withsqlite3.connect("../sqlitest.db")asdb:db.row_factory=sqlite3.Rowsql=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_qmakeTablesql_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*FROMDMCARDS;
Node.js
constsqlite=require("sqlite3");vardb=newsqlite.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#
usingSystem;usingMicrosoft.Data.Sqlite;classProgram{staticvoidMain(){using(vardb=newSqliteConnection("Data Source=../sqlitest.db")){db.Open();varsql=db.CreateCommand();sql.CommandText="SELECT * FROM DMCARDS";using(varrow=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
importsqlite3withsqlite3.connect("../sqlitest.db")asdb:db.row_factory=sqlite3.Rowsql=db.cursor()print("ID,NAME,COLOR,COST,POWER")forrowinsql.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"sdimrowssql_q"SELECT * FROM DMCARDS",rowsrepeatstatmessql_v("ID",rows)+","+sql_v("NAME",rows)+","+sql_v("COLOR",rows)+","+sql_i("COST",rows)+","+sql_i("POWER",rows)sql_nextrowsloopsql_close
テータベースの変更
データベースを開いて、
テーブルを変更して(UPDATE)、
データベースを閉じる。
SQL
UPDATEDMCARDSSETCOLOR='白'WHERECOLOR='光';UPDATEDMCARDSSETCOLOR='青'WHERECOLOR='水';UPDATEDMCARDSSETCOLOR='黒'WHERECOLOR='闇';UPDATEDMCARDSSETCOLOR='赤'WHERECOLOR='火';UPDATEDMCARDSSETCOLOR='緑'WHERECOLOR='自然';
Node.js
constsqlite=require("sqlite3");vardb=newsqlite.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#
usingSystem;usingMicrosoft.Data.Sqlite;classProgram{staticvoidMain(){using(vardb=newSqliteConnection("Data Source=../sqlitest.db")){db.Open();varsql=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
importsqlite3withsqlite3.connect("../sqlitest.db")asdb:db.row_factory=sqlite3.Rowsql=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
DROPTABLEIFEXISTSDMCARDS;
Node.js
constsqlite=require("sqlite3");vardb=newsqlite.Database("../sqlitest.db",err=>{db.serialize(()=>{db.run("DROP TABLE IF EXISTS DMCARDS");db.close();});});
C#
usingSystem;usingMicrosoft.Data.Sqlite;classProgram{staticvoidMain(){using(vardb=newSqliteConnection("Data Source=../sqlitest.db")){db.Open();varsql=db.CreateCommand();sql.CommandText="DROP TABLE IF EXISTS DMCARDS";sql.ExecuteNonQuery();}}}
Python
importsqlite3withsqlite3.connect("../sqlitest.db")asdb:db.row_factory=sqlite3.Rowsql=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
--データベースを削除DROPTABLEIFEXISTSDMCARDS;--データベース(テーブル)を初期化CREATETABLEIFNOTEXISTSDMCARDS(IDINTEGERPRIMARYKEYAUTOINCREMENT,NAMETEXT,COLORTEXT,COSTINTEGER,POWERINTEGER);INSERTINTODMCARDS(NAME,COLOR,COST,POWER)VALUES('ラ・ウラ・ギガ','光',1,2000);INSERTINTODMCARDS(NAME,COLOR,COST,POWER)VALUES('アクア・ガード','水',1,2000);INSERTINTODMCARDS(NAME,COLOR,COST,POWER)VALUES('ボーン・スライム','闇',1,1000);INSERTINTODMCARDS(NAME,COLOR,COST,POWER)VALUES('ブレイズ・クロー','火',1,1000);INSERTINTODMCARDS(NAME,COLOR,COST,POWER)VALUES('スナイプ・モスキート','自然',1,2000);--データベースを表示SELECT*FROMDMCARDS;SELECT'--------------------------------------';--データベースを変更UPDATEDMCARDSSETCOLOR='白'WHERECOLOR='光';UPDATEDMCARDSSETCOLOR='青'WHERECOLOR='水';UPDATEDMCARDSSETCOLOR='黒'WHERECOLOR='闇';UPDATEDMCARDSSETCOLOR='赤'WHERECOLOR='火';UPDATEDMCARDSSETCOLOR='緑'WHERECOLOR='自然';--データベースを表示SELECT*FROMDMCARDS;
Node.js
constsqlite=require("sqlite3");//データベース(テーブル)を初期化functionmakeDB():Promise<void>{returnnewPromise(resolve=>{vardb=newsqlite.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);});});});}//データベースを更新functionupdateDB():Promise<void>{returnnewPromise(resolve=>{vardb=newsqlite.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);});});});}//データベースを削除functiondropDB():Promise<void>{returnnewPromise(resolve=>{vardb=newsqlite.Database("../sqlitest.db",err=>{db.serialize(()=>{db.run("DROP TABLE IF EXISTS DMCARDS");db.close(resolve);});});});}//データベースを変更functionviewDB():Promise<void>{returnnewPromise(resolve=>{vardb=newsqlite.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);});});});}(asyncfunction(){awaitdropDB();awaitmakeDB();awaitviewDB();awaitupdateDB();awaitviewDB();})();
C#
usingSystem;usingMicrosoft.Data.Sqlite;classProgram{//データベース(テーブル)を初期化staticvoidmakeDB(){using(vardb=newSqliteConnection("Data Source=../sqlitest.db")){db.Open();varsql=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();}}//データベースを変更staticvoidupdateDB(){using(vardb=newSqliteConnection("Data Source=../sqlitest.db")){db.Open();varsql=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();}}//データベースを削除staticvoiddropDB(){using(vardb=newSqliteConnection("Data Source=../sqlitest.db")){db.Open();varsql=db.CreateCommand();sql.CommandText="DROP TABLE IF EXISTS DMCARDS";sql.ExecuteNonQuery();}}//データベースを表示staticvoidviewDB(){using(vardb=newSqliteConnection("Data Source=../sqlitest.db")){db.Open();varsql=db.CreateCommand();sql.CommandText="SELECT * FROM DMCARDS";using(varrow=sql.ExecuteReader()){Console.WriteLine("ID,NAME,COLOR,COST,POWER");while(row.Read()){Console.WriteLine($"{row["ID"]},{row["NAME"]},{row["COLOR"]},{row["COST"]},{row["POWER"]}");}}}}staticvoidMain(){dropDB();makeDB();viewDB();updateDB();viewDB();}}
Python
importsqlite3#データベース(テーブル)を初期化
defmakeDB():withsqlite3.connect("../sqlitest.db")asdb:db.row_factory=sqlite3.Rowsql=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)")#データベースを変更
defupdateDB():withsqlite3.connect("../sqlitest.db")asdb:db.row_factory=sqlite3.Rowsql=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='自然'")#データベースを削除
defdropDB():withsqlite3.connect("../sqlitest.db")asdb:db.row_factory=sqlite3.Rowsql=db.cursor()sql.execute("DROP TABLE IF EXISTS DMCARDS")#データベースを表示
defviewDB():withsqlite3.connect("../sqlitest.db")asdb:db.row_factory=sqlite3.Rowsql=db.cursor()print("ID,NAME,COLOR,COST,POWER")forrowinsql.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"#moduleProgram;データベース(テーブル)を初期化#deffuncmakeDBsql_open"../sqlitest.db"makeTable={"CREATE TABLE IF NOT EXISTS DMCARDS (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
NAME TEXT,COLOR TEXT,
COST INTEGER,
POWER INTEGER
)"}sql_qmakeTablesql_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_closereturn;データベースを変更#deffuncupdateDBsql_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_closereturn;データベースを削除#deffuncdropDBsql_open"../sqlitest.db"sql_q"DROP TABLE IF EXISTS DMCARDS"sql_closereturn;データベースを表示#deffuncviewDBsql_open"../sqlitest.db"mes"ID,NAME,COLOR,COST,POWER"sdimrowssql_q"SELECT * FROM DMCARDS",rowsrepeatstatmessql_v("ID",rows)+","+sql_v("NAME",rows)+","+sql_v("COLOR",rows)+","+sql_i("COST",rows)+","+sql_i("POWER",rows)sql_nextrowsloopsql_closereturn#deffuncmaindropDBmakeDBviewDBupdateDBviewDBreturn#globalmain
感想とか補足
以上、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」を使うとコケるのでそれは注意。