5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLServerの日本語テーブル・列構成とレコードをSQLite3にお引越し

5
Last updated at Posted at 2026-07-24

はじめに

SQLServer、Mysql、PostgreSQLのODBCドライバ向けのC言語ライブラリを日本語プログラミング言語Mind用に実装していますが、SQLiteも少し対応してみようかなという気がしてきましたので、まずはスキーマとレコードの準備の備忘録です。

前提条件

Windows11 Pro 22H2 22621.4317

SQL Server 16.0.1000.6 Express Edition
SQL Server Management Studio 19.2.56.2
SQLite version 3.43.2 2023-10-10 12:14:04

お題のデータべース

SQLServer、Mysql、PostgreSQLでは共通のテーブル構成のデータベースを作成しています。データベース名は「日本語プログラミング言語」です。それを各データベース用に作成して検証に利用します。今回はSQLite3用に同じものを作成します。

db.png

各テーブルの列の型はたいしたものを使っていませんので、SQLiteの列型でもだいじょうぶでした。

SQLite

SQLiteはODBCドライバーに付属のものを使用しています。

C:\Program Files\SQLite ODBC Driver for Win64>sqlite3
SQLite version 3.43.2 2023-10-10 12:14:04
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

Current version
sqliteodbc.exe
sqliteodbc_w64.exe ←こちらをダウンロード

お題のデータべース作成

SQLServer、Mysql、PostgreSQLではGUIの管理ツールがありますが、SQLiteはなさそうなので、とりあえずSQLServerManagementStudioでSQLServerのテーブルのDDLをリバース作成して、それをCopilotにSQLite3用に書き換えてもらいました。

データべースのファイルを作成

下記のコマンドでお題のデータべースのファイルを作成します。

sqlite3 "C:\sqlite3\日本語プログラミング言語.db"

データベースファイルを格納するフォルダは事前に作成しておかないと、.tablesコマンド実行の時点でファイルができていないことが判明します。

C:\Program Files\SQLite ODBC Driver for Win64>sqlite3 "C:\sqlite3\日本語プログラミング言語.db"
SQLite version 3.43.2 2023-10-10 12:14:04
Enter ".help" for usage hints.
sqlite> .tables
Error: unable to open database "C:\sqlite3\日本語プログラミング言語.db": unable to open database file

.tablesコマンドでCLIプロンプトが返ったらとりあえずできている証拠。

C:\Program Files\SQLite ODBC Driver for Win64>sqlite3 "C:\sqlite3\日本語プログラミング言語.db"
SQLite version 3.43.2 2023-10-10 12:14:04
Enter ".help" for usage hints.
sqlite> .tables
sqlite>

dirコマンドで確認してみますと、実際にファイルができていました。
※dirコマンドのコンソール出力結果は一部省略しています。

c:\sqlite3>dir        .
2026/07/24  22:55            40,960 日本語プログラミング言語.db

データべースのテーブルを作成

生成AIに翻訳してもらったSQLServerのDDLのSQLite3バージョンです。

CREATE TABLE "言語名" (
    "言語ID" INTEGER PRIMARY KEY AUTOINCREMENT,
    "言語名" TEXT NOT NULL,
    "公開年" INTEGER,
    "よみがな" TEXT
);

CREATE TABLE "後継言語" (
    "言語ID" INTEGER NOT NULL,
    "後継言語ID" INTEGER NOT NULL,
    PRIMARY KEY ("言語ID", "後継言語ID")
);

CREATE TABLE "姉妹言語" (
    "言語ID" INTEGER NOT NULL,
    "姉妹言語ID" INTEGER NOT NULL,
    PRIMARY KEY ("言語ID", "姉妹言語ID")
);

CREATE TABLE "開発言語" (
    "言語ID" INTEGER NOT NULL,
    "開発言語ID" INTEGER NOT NULL,
    PRIMARY KEY ("言語ID", "開発言語ID")
);

CREATE TABLE "開発言語名" (
    "開発言語ID" INTEGER NOT NULL,
    "開発言語名" TEXT NOT NULL,
    "自言語ID" INTEGER,
    PRIMARY KEY ("開発言語ID")
);

下記のようにCLIに貼り付けます。

C:\Program Files\SQLite ODBC Driver for Win64>sqlite3 "C:\sqlite3\日本語プログラミング言語.db"
SQLite version 3.43.2 2023-10-10 12:14:04
Enter ".help" for usage hints.
sqlite> .tables
sqlite> CREATE TABLE "言語名" (
(x1...>     "言語ID" INTEGER PRIMARY KEY AUTOINCREMENT,
(x1...>     "言語名" TEXT NOT NULL,
(x1...>     "公開年" INTEGER,
(x1...>     "よみがな" TEXT
(x1...> );
sqlite>
sqlite> CREATE TABLE "後継言語" (
(x1...>     "言語ID" INTEGER NOT NULL,
(x1...>     "後継言語ID" INTEGER NOT NULL,
(x1...>     PRIMARY KEY ("言語ID", "後継言語ID")
(x1...> );
sqlite>
sqlite> CREATE TABLE "姉妹言語" (
(x1...>     "言語ID" INTEGER NOT NULL,
(x1...>     "姉妹言語ID" INTEGER NOT NULL,
(x1...>     PRIMARY KEY ("言語ID", "姉妹言語ID")
(x1...> );
sqlite>
sqlite> CREATE TABLE "開発言語" (
(x1...>     "言語ID" INTEGER NOT NULL,
(x1...>     "開発言語ID" INTEGER NOT NULL,
(x1...>     PRIMARY KEY ("言語ID", "開発言語ID")
(x1...> );
sqlite>
sqlite> CREATE TABLE "開発言語名" (
(x1...>     "開発言語ID" INTEGER NOT NULL,
(x1...>     "開発言語名" TEXT NOT NULL,
(x1...>     "自言語ID" INTEGER,
(x1...>     PRIMARY KEY ("開発言語ID")
(x1...> );
sqlite>

.tablesコマンドでテーブルができていることを確認します。

sqlite> .tables
姉妹言語     言語名        開発言語名
後継言語     開発言語
sqlite>

データべースのデータをコピー

SQLServer上で実行するとSQLite3のINSERT INTO文を結果セットで返してくれるSELECT文をCopilotに作ってもらいました。
テーブルのCreate文を翻訳してもらっているのでスムーズでした。

SELECT
    'INSERT INTO "言語名" ("言語ID", "言語名", "公開年", "よみがな") VALUES ('
    + CAST(言語ID AS NVARCHAR(10)) + ', '
    + '''' + 言語名 + ''', '
    + CAST(公開年 AS NVARCHAR(10)) + ', '
    + '''' + よみがな + ''''
    + ');'
FROM 言語名;

SELECT
    'INSERT INTO "開発言語" ("言語ID", "開発言語ID") VALUES ('
    + CAST(言語ID AS NVARCHAR(10)) + ', '
    + CAST(開発言語ID AS NVARCHAR(10))
    + ');'
FROM 開発言語;

SELECT
    'INSERT INTO "開発言語名" ("開発言語ID", "開発言語名", "自言語ID") VALUES ('
    + CAST(開発言語ID AS NVARCHAR(10)) + ', '
    + '''' + 開発言語名 + ''', '
    + COALESCE(CAST(自言語ID AS NVARCHAR(10)), 'NULL')
    + ');'
FROM 開発言語名;

SELECT
    'INSERT INTO "後継言語" ("言語ID", "後継言語ID") VALUES ('
    + CAST(言語ID AS NVARCHAR(10)) + ', '
    + CAST(後継言語ID AS NVARCHAR(10))
    + ');'
FROM 後継言語;

SELECT
    'INSERT INTO "姉妹言語" ("言語ID", "姉妹言語ID") VALUES ('
    + CAST(言語ID AS NVARCHAR(10)) + ', '
    + CAST(姉妹言語ID AS NVARCHAR(10))
    + ');'
FROM 姉妹言語;

SQLServer上で実行した結果は下記の感じ。

INSERT INTO "開発言語名" ("開発言語ID", "開発言語名", "自言語ID") VALUES (1, 'C', NULL);
INSERT INTO "開発言語名" ("開発言語ID", "開発言語名", "自言語ID") VALUES (2, 'C#', NULL);
INSERT INTO "開発言語名" ("開発言語ID", "開発言語名", "自言語ID") VALUES (3, 'Java', NULL);
INSERT INTO "開発言語名" ("開発言語ID", "開発言語名", "自言語ID") VALUES (4, 'VisualBasic', NULL);
INSERT INTO "開発言語名" ("開発言語ID", "開発言語名", "自言語ID") VALUES (5, 'Delphi', NULL);
INSERT INTO "開発言語名" ("開発言語ID", "開発言語名", "自言語ID") VALUES (6, 'VisualBasic.net', NULL);
INSERT INTO "開発言語名" ("開発言語ID", "開発言語名", "自言語ID") VALUES (7, 'Forth', NULL);
INSERT INTO "開発言語名" ("開発言語ID", "開発言語名", "自言語ID") VALUES (8, 'Mind', 1);
INSERT INTO "開発言語名" ("開発言語ID", "開発言語名", "自言語ID") VALUES (9, 'Node.js', NULL);
INSERT INTO "開発言語名" ("開発言語ID", "開発言語名", "自言語ID") VALUES (10, 'Tcl/Tk', NULL);

これらをSQLite3のCLIに貼り付けます。上記のサンプルは「開発言語名」のレコードですが、下記のサンプルは「開発言語」のレコードです。

sqlite> INSERT INTO "言語名" ("言語ID", "言語名", "公開年", "よみがな") VALUES (1, 'Mind', 1985, 'まいんど');
sqlite> INSERT INTO "言語名" ("言語ID", "言語名", "公開年", "よみがな") VALUES (2, 'TTS', 2000, 'てぃーてぃーえす');
sqlite> INSERT INTO "言語名" ("言語ID", "言語名", "公開年", "よみがな") VALUES (3, 'ひまわり', 2001, 'ひまわり');
sqlite> INSERT INTO "言語名" ("言語ID", "言語名", "公開年", "よみがな") VALUES (4, 'ドリトル', 2003, 'どりとる');
sqlite> INSERT INTO "言語名" ("言語ID", "言語名", "公開年", "よみがな") VALUES (5, 'なでしこ', 2004, 'なでしこ');
sqlite> INSERT INTO "言語名" ("言語ID", "言語名", "公開年", "よみがな") VALUES (6, 'プロデル', 2007, 'ぷろでる');
sqlite> INSERT INTO "言語名" ("言語ID", "言語名", "公開年", "よみがな") VALUES (7, 'Mind for Android', 2012, 'まいんど');
sqlite> INSERT INTO "言語名" ("言語ID", "言語名", "公開年", "よみがな") VALUES (8, 'スミレ', 2018, 'すみれ');
sqlite> INSERT INTO "言語名" ("言語ID", "言語名", "公開年", "よみがな") VALUES (9, 'なでしこ3', 2018, 'なでしこさん');
sqlite> INSERT INTO "言語名" ("言語ID", "言語名", "公開年", "よみがな") VALUES (10, 'スミレ畑', 2020, 'すみればたけ');

無事にSELEC文の成功です。

sqlite> SELECT * FROM "言語名";
1|Mind|1985|まいんど
2|TTS|2000|てぃーてぃーえす
3|ひまわり|2001|ひまわり
4|ドリトル|2003|どりとる
5|なでしこ|2004|なでしこ
6|プロデル|2007|ぷろでる
7|Mind for Android|2012|まいんど
8|スミレ|2018|すみれ
9|なでしこ3|2018|なでしこさん
10|スミレ畑|2020|すみればたけ

おわりに

いかがでしたでしょうか?なにかの参考になれば幸いです。

SQLServerやSQLite3はAIもみっちり学習している感じで、ストレスを感じませんでした。エージェントにローカルのSQLServerの接続情報を与えれば、わりと全自動でできそうな勢いでした。

5
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
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?