sqlite バージョン 2 から 3に変換する方法
カテゴリー: ぷろぐらみんぐ/データベース
2010-11-02
公式サイトのformatchng.htmlには、2と3は、完全に互換性がないと書いてあります。
ということで、変換が必要になります。
公式サイトから、sqlite.exe sqlite3.exeをダウンロードします
(※sqlite.exe(sqlite-2_8_17.zip): ソース sqlite-2.8.17.tar.gz)
コマンドプロンプトなどで
変換するコマンド
直接生成する場合
sqlite.exe old.db .dump | sqlite3.exe new.db
一度テキストに保存したい場合
sqlite.exe old.db .dump > old_db_dump.sql
ここで、必要に応じて、old_db_dump.sqlを修正します
sqlite3.exe new.db < old_db_dump.sql
※問題点
sqlite.exe(2.8.17) のダンプがキーワードをエスケープしない欠陥があるので
定義済みキーワードを使ったテーブル、列名などがある場合、
取り込みでエラーを起こす可能性があります
その場合、一度テキストにダンプして一括修正後、取り込みが必要になります
sqlite3.exeのダンプでは、問題ないようです。
例 sqlite.exe のダンプ: INSERT INTO item VALUES(1);
例 sqlite3.exe のダンプ: INSERT INTO "item" VALUES(1);
例: create table "where" (id text);
INSERT INTO "where" VALUES(1);
追記
sqlite.exe(sqlite 2.8.17)のパッチ
sqlite-2.8.17-47fee16ba9bd8ab2.diff
--- SQLite-47fee16ba9bd8ab2/src/shell.c 2007-01-08 16:20:28.000000000 +0900
+++ SQLite-47fee16ba9bd8ab2/src/shell.c 2010-11-04 23:00:00.000000000 +0900
@@ -421,7 +421,7 @@
p->zDestTable = 0;
}
if( zName==0 ) return;
- needQuote = !isalpha(*zName) && *zName!='_';
+ needQuote = *zName!='_';
for(i=n=0; zName[i]; i++, n++){
if( !isalnum(zName[i]) && zName[i]!='_' ){
needQuote = 1;
追記: 2011.12
バイナリデータを含んでいた場合、DUMPに失敗することがわかりました。
patch2を作りました。
別記事になります。
sqlite patch p2
で検索してください。
ということで、変換が必要になります。
公式サイトから、sqlite.exe sqlite3.exeをダウンロードします
(※sqlite.exe(sqlite-2_8_17.zip): ソース sqlite-2.8.17.tar.gz)
コマンドプロンプトなどで
変換するコマンド
直接生成する場合
sqlite.exe old.db .dump | sqlite3.exe new.db
一度テキストに保存したい場合
sqlite.exe old.db .dump > old_db_dump.sql
ここで、必要に応じて、old_db_dump.sqlを修正します
sqlite3.exe new.db < old_db_dump.sql
※問題点
sqlite.exe(2.8.17) のダンプがキーワードをエスケープしない欠陥があるので
定義済みキーワードを使ったテーブル、列名などがある場合、
取り込みでエラーを起こす可能性があります
その場合、一度テキストにダンプして一括修正後、取り込みが必要になります
sqlite3.exeのダンプでは、問題ないようです。
例 sqlite.exe のダンプ: INSERT INTO item VALUES(1);
例 sqlite3.exe のダンプ: INSERT INTO "item" VALUES(1);
例: create table "where" (id text);
INSERT INTO "where" VALUES(1);
追記
sqlite.exe(sqlite 2.8.17)のパッチ
sqlite-2.8.17-47fee16ba9bd8ab2.diff
--- SQLite-47fee16ba9bd8ab2/src/shell.c 2007-01-08 16:20:28.000000000 +0900
+++ SQLite-47fee16ba9bd8ab2/src/shell.c 2010-11-04 23:00:00.000000000 +0900
@@ -421,7 +421,7 @@
p->zDestTable = 0;
}
if( zName==0 ) return;
- needQuote = !isalpha(*zName) && *zName!='_';
+ needQuote = *zName!='_';
for(i=n=0; zName[i]; i++, n++){
if( !isalnum(zName[i]) && zName[i]!='_' ){
needQuote = 1;
追記: 2011.12
バイナリデータを含んでいた場合、DUMPに失敗することがわかりました。
patch2を作りました。
別記事になります。
sqlite patch p2
で検索してください。