この記事ではmysqldumpファイルをsqlite3にインポートする方法をご紹介します。
データベースからmysqldumpをしたデータベース管理アプリケーションはSequel Ace、sqliteはTablePlusを使用してインポートしました。
Sequel Aceを使用して出力したデータは次の通りです。
このままではsqliteが対応していない構文があるのでsqliteにインポートできないので、編集する必要があります。
# ************************************************************
# Sequel Ace SQL dump
# バージョン 20033
#
# https://sequel-ace.com/
# https://github.com/Sequel-Ace/Sequel-Ace
#
# ホスト: ... (MySQL 5.7.33-log)
# データベース: ...
# 生成時間: 2022-06-03 02:07:10 +0000
# ************************************************************
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
SET NAMES utf8mb4;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
# テーブルのダンプ image
# ------------------------------------------------------------
DROP TABLE IF EXISTS `image`;
CREATE TABLE `image` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`created_at` datetime(6) NOT NULL,
`updated_at` datetime(6) NOT NULL,
`deleted_at` datetime(6) DEFAULT NULL,
`title` varchar(150) DEFAULT NULL,
`path` varchar(100) DEFAULT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `image_user_id_9168ff31_fk_user_id` (`user_id`),
CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
LOCK TABLES `image` WRITE;
/*!40000 ALTER TABLE `image` DISABLE KEYS */;
INSERT INTO `image` (`id`, `created_at`, `updated_at`, `deleted_at`, `title`, `path`, `user_id`)
VALUES
(1,'2021-04-28 02:45:13.088089','2021-04-28 02:45:13.088129',NULL,NULL,'uploads/2021/04/image.png',146);
/*!40000 ALTER TABLE `image` ENABLE KEYS */;
UNLOCK TABLES;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
sqliteにインポートできるように、このdumpファイルを編集したファイルは次の通りです。
DROP TABLE IF EXISTS `image`;
CREATE TABLE `image` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`created_at` datetime(6) NOT NULL,
`updated_at` datetime(6) NOT NULL,
`deleted_at` datetime(6) DEFAULT NULL,
`title` varchar(150) DEFAULT NULL,
`path` varchar(100) DEFAULT NULL,
`user_id` int(11) NOT NULL,
CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
);
INSERT INTO `image` (`id`, `created_at`, `updated_at`, `deleted_at`, `title`, `path`, `user_id`)
VALUES
(1,'2021-04-28 02:45:13.088089','2021-04-28 02:45:13.088129',NULL,NULL,'uploads/2021/04/image.png',146);
sqliteにインポートさせるためにdumpファイルを編集する部分は以下の通りです。
- コメントアウトをすべて削除
- SET NAMES utf8mb4;を削除
- LOCK TABLESをすべて削除
- idをINTEGER PRIMARY KEY AUTOINCREMENT NOT NULLに変更
- KEYを削除
- ENGINE=InnoDB DEFAULT CHARSET=utf8mb4を削除
一つ一つ説明します。
コメントアウトをすべて削除
コメントアウトがあると
unrecognized token: “#”
というエラーが出るので、# ...
や/* ... */
で囲われたコメントアウトはすべて削除します。
ダンプファイルにあるコメントアウトはこれらです。これらはすべて不要なので削除します。
# ************************************************************
# Sequel Ace SQL dump
# バージョン 20033
#
# https://sequel-ace.com/
# https://github.com/Sequel-Ace/Sequel-Ace
#
# ホスト: ... (MySQL 5.7.33-log)
# データベース: ...
# 生成時間: 2022-06-03 02:07:10 +0000
# ************************************************************
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
# テーブルのダンプ image
# ------------------------------------------------------------
...
/*!40000 ALTER TABLE `image` DISABLE KEYS */;
...
/*!40000 ALTER TABLE `image` ENABLE KEYS */;
...
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
SET NAMES utf8mb4;を削除
sqliteはSET
に対応していないので、
near “SET”: syntax error
がでます。
なので、SET NAMES utf8mb4;
を削除します。
SET NAMES utf8mb4;
DROP TABLE IF EXISTS `image`;
CREATE TABLE `image` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`created_at` datetime(6) NOT NULL,
`updated_at` datetime(6) NOT NULL,
`deleted_at` datetime(6) DEFAULT NULL,
`title` varchar(150) DEFAULT NULL,
`path` varchar(100) DEFAULT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `image_user_id_9168ff31_fk_user_id` (`user_id`),
CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
LOCK TABLES `image` WRITE;
INSERT INTO `image` (`id`, `created_at`, `updated_at`, `deleted_at`, `title`, `path`, `user_id`)
VALUES
(1,'2021-04-28 02:45:13.088089','2021-04-28 02:45:13.088129',NULL,NULL,'uploads/2021/04/imagemys.png',146);
UNLOCK TABLES;
LOCK TABLESをすべて削除
sqliteはLOCK
にも対応していないので、
near “LOCK”: syntax error
のエラーが出ます。
なので、LOCK TABLES image WRITE;
とUNLOCK TABLES;
を削除します。
DROP TABLE IF EXISTS `image`;
CREATE TABLE `image` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`created_at` datetime(6) NOT NULL,
`updated_at` datetime(6) NOT NULL,
`deleted_at` datetime(6) DEFAULT NULL,
`title` varchar(150) DEFAULT NULL,
`path` varchar(100) DEFAULT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `image_user_id_9168ff31_fk_user_id` (`user_id`),
CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
LOCK TABLES `image` WRITE;
INSERT INTO `image` (`id`, `created_at`, `updated_at`, `deleted_at`, `title`, `path`, `user_id`)
VALUES
(1,'2021-04-28 02:45:13.088089','2021-04-28 02:45:13.088129',NULL,NULL,'uploads/2021/04/imagemys.png',146);
UNLOCK TABLES;
idをINTEGER PRIMARY KEY AUTOINCREMENT NOT NULLに変更
sqliteはdumpファイルのAUTO_INCREMENT
では
near “AUTO_INCREMENT”: syntax error
というエラーがでます。
DROP TABLE IF EXISTS `image`;
CREATE TABLE `image` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`created_at` datetime(6) NOT NULL,
`updated_at` datetime(6) NOT NULL,
`deleted_at` datetime(6) DEFAULT NULL,
`title` varchar(150) DEFAULT NULL,
`path` varchar(100) DEFAULT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `image_user_id_9168ff31_fk_user_id` (`user_id`),
CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `image` (`id`, `created_at`, `updated_at`, `deleted_at`, `title`, `path`, `user_id`)
VALUES
(1,'2021-04-28 02:45:13.088089','2021-04-28 02:45:13.088129',NULL,NULL,'uploads/2021/04/imagemys.png',146);
そのため、id
は以下のように変更する必要があります。
`id` int(11) NOT NULL AUTO_INCREMENT,
↓
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
AUTO_INCREMENT
を削除するだけでも大丈夫ですが、データを保存するときにid
は自動採番にならないので思いもよらないエラーになる可能性があります。
KEYを削除
sqliteはdumpファイルのKEY
では
table “image” has more than one primary key
のエラーが出るのでKEYを作書します。
CREATE TABLE `image` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`created_at` datetime(6) NOT NULL,
`updated_at` datetime(6) NOT NULL,
`deleted_at` datetime(6) DEFAULT NULL,
`title` varchar(150) DEFAULT NULL,
`path` varchar(100) DEFAULT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `image_user_id_9168ff31_fk_user_id` (`user_id`),
CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
また、今回のdumpファイルにはありませんが、UNIQUE KEY `email` (`email`),
という書き方もエラーになります。
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4を削除
sqlieはENGINE=InnoDB DEFAULT CHARSET=utf8mb4
に対応していないので
near “ENGINE”: syntax error
のエラーが出ます。
そのためENGINE=InnoDB DEFAULT CHARSET=utf8mb4
を削除します。
CREATE TABLE `image` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`created_at` datetime(6) NOT NULL,
`updated_at` datetime(6) NOT NULL,
`deleted_at` datetime(6) DEFAULT NULL,
`title` varchar(150) DEFAULT NULL,
`path` varchar(100) DEFAULT NULL,
`user_id` int(11) NOT NULL,
CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
まとめ
mysqlのdumpファイルをsqliteにインポートさせるために次のように編集する必要があります。
- コメントアウトをすべて削除
- SET NAMES utf8mb4;を削除
- LOCK TABLESをすべて削除
- idをINTEGER PRIMARY KEY AUTOINCREMENT NOT NULLに変更
- KEYを削除
- ENGINE=InnoDB DEFAULT CHARSET=utf8mb4を削除
編集後のdumpファイルは以下の通りです。
DROP TABLE IF EXISTS `image`;
CREATE TABLE `image` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`created_at` datetime(6) NOT NULL,
`updated_at` datetime(6) NOT NULL,
`deleted_at` datetime(6) DEFAULT NULL,
`title` varchar(150) DEFAULT NULL,
`path` varchar(100) DEFAULT NULL,
`user_id` int(11) NOT NULL,
CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
);
INSERT INTO `image` (`id`, `created_at`, `updated_at`, `deleted_at`, `title`, `path`, `user_id`)
VALUES
(1,'2021-04-28 02:45:13.088089','2021-04-28 02:45:13.088129',NULL,NULL,'uploads/2021/04/image.png',146);
コメント