【SQLiteからMySQLへの移行1】 SQLiteでのDBのダンプ
SQLiteでは、charsetがShift-JISでは扱えないため、MySQLの使用も検討し始めた。
プログラム側でcharsetを変換するプログラムを作成する方法も検討したが、C言語でiconvを使用したcharset変換DLLの作成を試みたが、DLL作成時にエラーとなり、それが解決出来なかったので、DB側で解決することを考え始めた。。。
その第一歩として、SQLiteのデータをダンプする。
なお、DBのサンプルは、@bighope さんの「MT4からDATABASEを利用する。」で紹介されているEventDate.dbを利用させて頂きました。
1.SQLiteでDBに接続する
接続し、接続先データベースの確認、テーブルの確認を行う。
C:\dev\SQLite>sqlite3.exe EventDate.db SQLite version 3.8.2 2013-12-06 14:53:30 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .databases seq name file --- --------------- ---------------------------------------------------- 0 main C:\dev\SQLite\EventDate.db sqlite> .tables HistoricalDate sqlite>
2.コマンド実行結果の出力先をダンプファイルに変更する。
SQLiteのダンプとは、「データだけでなくテーブルの構造なども含むデータベースに関する情報をSQL文の形式で出力すること」なので、出力先の拡張子はsqlとする。
実行するとファイルが作成され、コマンドの実行結果が全てそこに出力される。
※)コマンドの実行結果が全て出力されるので、ダンプコマンド以外のコマンドを入力すると余計なものがダンプファイルに出力されるので注意すること。
sqlite> .output EventDateDump.sql
3.ダンプを実効する
sqlite> .dump HistoricalDate
4.出力先を標準出力に戻す
ダンプには直接関係ないが、ダンプ後にコマンドを入力してダンプファイルを壊さないようにするために、コマンド実行結果の出力先を標準出力に戻しておく。
sqlite> .output stdout
5.ダンプファイルを確認する
確かに、SQLが出力されている。
外部キーの設定、トランザクションの開始、テーブル作成、データ投入、そして最後にコミットとなっている。
create table時の、テーブル名とカラム名が([])で囲まれているなど、そのままMySQLでは実行できない点がありそうなので、そこはMySQLで実行時に考える。
PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE [HistoricalDate] ([id] INTEGER NOT NULL UNIQUE, [nen] INTEGER, [tuki] INTEGER, [niti] INTEGER, [zi] INTEGER, [fun] INTEGER, [kuni] TEXT, [event] TEXT, [lank] INTEGER, [mae] TEXT, [yoso] TEXT, [keka] TEXT, PRIMARY KEY(id) ); INSERT INTO "HistoricalDate" VALUES(1,2007,9,17,-1,0,'JP','休場(敬老の日)',0,NULL,NULL,NULL); INSERT INTO "HistoricalDate" VALUES(2,2007,9,17,10,0,'EU','7月貿易収支<季調前>',1,'+76億ユーロ','+70億ユーロ','+46億ユーロ'); INSERT INTO "HistoricalDate" VALUES(3,2007,9,17,10,0,'EU','7月貿易収支<季調済>',1,'+44億ユーロ','+40億ユーロ','-6億ユーロ'); INSERT INTO "HistoricalDate" VALUES(4,2007,9,17,13,30,'US','9月NY連銀製造業景気指数',2,'25.1','18','14.7'); INSERT INTO "HistoricalDate" VALUES(5,2007,9,17,16,0,'CH','ロートSNB総裁講演',2,NULL,NULL,NULL); INSERT INTO "HistoricalDate" VALUES(6,2007,9,18,0,50,'JP','7月第3次産業活動指数(前月比)',2,'0.10%','-0.50%','-0.50%'); INSERT INTO "HistoricalDate" VALUES(7,2007,9,18,4,10,'AU','スティーブンスRBA総裁講演',3,NULL,NULL,NULL); INSERT INTO "HistoricalDate" VALUES(8,2007,9,18,8,15,'CH','第2四半期鉱工業生産指数(前期比)',2,'-4.70%','5.20%','6.70%'); INSERT INTO "HistoricalDate" VALUES(9,2007,9,18,9,30,'GB','8月CPI(前年比)',4,'1.90%','1.90%','1.80%'); INSERT INTO "HistoricalDate" VALUES(10,2007,9,18,9,30,'GB','8月CPIコア(前年比)',4,'1.70%','1.80%','1.80%'); ・・・・・・・・・・・・・・・・・・・・・・・ COMMIT;