sqlite3 から mysql に移行するときに起こりうる問題のコレクション

sqlite3 から mysql に移行するときに起こりうる問題のコレクション

簡単な説明

適切な読者: モバイル開発

sqlite3 データを mysql に移行する場合、多くの構文上の問題が発生します。一度にすべての問題をリストすることは不可能です。誰もが異なる問題に遭遇するため、この記事ではできるだけ多くの問題をリストアップします。読者はこの記事を参考にして、問題が発生するかどうかを事前に予測することができます。何が起こるかを知っておくと、データの移行後に発生する可能性のある予期しない問題を回避または軽減するのに役立ちます。問題リストを見ると、どのような問題を解決する必要があるかがわかります。参考までに解決策も提供します。移行の問題には、誰もが異なる問題に遭遇するため、万能の解決策はありません。解決策の中に矛盾する問題が同時に存在する場合、問題になります。

さて、早速本題に入りましょう!

質問リスト

1. sqlite3 によってダンプされたさまざまな変数 (BEGIN TRANSACTION、COMMIT など) は、mysql では認識されません。

2. sqliteデータベースデータは隠しフィールドrowidをエクスポートできません

3. sqliteデータベースのデータエクスポート形式は、一重引用符や二重引用符など、他のデータベースと互換性がありません。

4. エクスポートされた sqlite データには、 INSERT INTO protocol VALUES('大類頁(新)', ' ')に示すように、列名がありません。必要なのはINSERT INTO protocol('text1','text2') VALUES('大類頁(新)', '刷新頁')です。

5. エスケープ文字「\」などの特殊記号処理

6. テーブルフィールドの長さ制限が異なる

7. データ書き込み効率

問題解決

まず、sqliteStudio や Navicat などのツールは使用できません。ここでは、シェル コマンドを使用してコンテンツ生成を直接回避できます。

取引を開始

専念

一意のインデックスを作成する

プラグマ外部キー=OFF

同時に、シェル メソッドを使用すると、非常に少ないコードで実装できます。

1. フィールド列名が出力されない問題を解決する

sqlite3コマンド「 pragma table_info(表名); 」を実行すると、次の出力が得られます。

0|名前|テキスト|0||0

1|説明|テキスト|0||0

次に、次のように文字列置換によって列名を取得します。

変数はCOLS = name、descriptionであると仮定します。

2. 一重引用符と二重引用符の問題を解決する

sqlite3コマンド「 .mode insert && .dump 表名」を実行すると、次の出力が得られます。

テーブル名にINSERT INTO VALUES ('test',' test');

テーブル名にINSERT INTO VALUES ('test','test');

テーブル名にINSERT INTO VALUES ('test','test');

この方法は、シングルクォートとダブルクォートの問題を解決できます。ここでは、シングルクォートを均一に直接出力します。

3. sqlite3のデフォルトフィールドrowidが表示されない問題を解決します。ここでは、rowidを直接idに変更します。

現在のモードを.dump挿入モードに設定する

sqlite3コマンド「 select rowid as id,$COLS from 表名」を実行すると、次の出力が得られます。

テーブル名にINSERT INTO VALUES (1,'test',' test');

テーブル名にINSERT INTO VALUES (2,'test','test');

テーブル名にINSERT INTO VALUES (3,'test','test');

4. シェル文字列コマンドを使用して、以前に取得した列名を次のSQL文に追加します。

変更後は次のようになります。

テーブル名 ('name',' description') に INSERT INTO VALUES (1,'test',' test');

テーブル名('name',' description')にINSERT INTO VALUES(2,'test','test');

テーブル名('name',' description')にINSERT INTO VALUES(3,'test','test');

5. エスケープ文字の処理

データベース内のデータにエスケープ文字が含まれている場合、例: {\"lastname\":\\"天津\\"} 。このタイプのデータが処理されない場合、データベースに挿入されると{"lastname":\"天津\"}になります。したがって、エスケープ文字を処理する必要があります。シェルコマンドを使用して処理するのは非常に簡単です。たとえば、コマンド: sed 's#\\#\\\\#g'などです。
ソリューションの実装

このスクリプトは主に上記1〜5の問題を解決します。必要に応じてスクリプトを変更できます。

 #!/bin/sh
 SQLite = sqlite3
 if [ -z "$1" ] ; then
   echo 使用法: $0 sqlite3.db
   出口
 フィ
 DB="$1"
 テーブル = `"$SQLITE" "$DB" .tables`
 $TABLES内のTABLEに対して、
   CREATE=`"$SQLITE" "$DB" "SELECT sql FROM sqlite_master WHERE type=\"table\" AND name = \"$TABLE\";"`
   echo $CREATE";" |
   カット -d'=' -f2 |
   sed "s/^CREATE TABLE $TABLE (/CREATE TABLE $TABLE (id int auto_increment 主キー ,/g"
   COLS=`"$SQLITE" "$DB" "pragma table_info($TABLE)" | cut -d'|' -f2 `
   COLS_CS=`echo $COLS | sed 's/ /,/g'`
   echo ".mode insert \n.header on \n select rowid as id,$COLS_CS from $TABLE;\n" |
   "$SQLITE" "$DB" |
   sed "s/^INSERT INTO \"table\"/INSERT INTO $TABLE /g" |
   's#\\#\\\\#g' を実行します
 終わり

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • Ghost を SQLite3 データベースから MySQL データベースに移行する

<<:  Linux CRM デプロイメント コードの詳細な説明

>>:  Element PlusはAffixを実装します

推薦する

CSSスタイルシートを効率的に使用するためのヒント: スタイルシートの力を最大限に活用する

インターネット経済の継続的な発展に伴い、インターネット上の専門ウェブサイト、公共サービスウェブサイト...

Windows 10 でカスタムドメイン名をバインドするように Hexo と GitHub を構成する方法

Hexo は Windows 10 でカスタムドメイン名を GitHub にバインドしますまずドメイ...

mysql5.7.20 のインストールと設定方法のグラフィック チュートリアル (mac)

MySQL 5.7.20のインストールと設定方法のグラフィックチュートリアルをあなたと共有します1...

MySQLのどのフィールドがインデックスに適しているかについての簡単な説明

目次1 データベース インデックスを作成するための一般的なルールは次のとおりです。 2. 数千万件の...

フロントエンド HTML+CSS+JS を使用してシンプルな TODOLIST 関数を開発する (メモ帳)

目次1. 簡単な紹介2. スクリーンショットを実行する3. コードの紹介4. まとめ1. 簡単な紹介...

Vueルータールーティングガードの詳細な説明

目次1. グローバル beforeEach 1. グローバル beforeEach 2. 実装2. ...

CSS3は三角形の連続拡大効果を実現します

1. CSS3の三角形は特殊効果でズームし続けます11.1 画像プレビュー 11.2 index.h...

最高の無料英語フォント33選を紹介

チャンクファイブフリータイプファミリーCuprum JAH I フリーフォントイェセヴァブークレフィ...

HTML に基づいてページを更新せずにフォーム送信を実装する

ページを更新せずにフォーム送信を実装するために Ajax を使用することは、プロジェクトでよく使用さ...

Docker を使用した Hadoop クラスターのデプロイに関する詳細なチュートリアル

最近、社内に Hadoop テスト クラスターを構築したいので、docker を使用して Hadoo...

nginx.conf ファイルの構文強調表示とフォーマット設定には nginx.vim ツールを使用します。

私はtengineを使用しています。インストールディレクトリは/usr/local/tengineで...

トリガーメソッドを使用して、ファイルタイプの入力をクリックせずにポップアップファイル選択ダイアログボックスを実現します。

トリガー メソッドを使用できます。JavaScript にはネイティブのトリガー関数はありません。自...

CentOS はローカル yum ソースを使用して LAMP 環境を構築するグラフィック チュートリアル

この記事では、ローカル yum ソースを使用して CentOS 上に LAMP 環境を構築する方法に...

ReactとAntdのFormコンポーネントを組み合わせてログイン機能を実装する方法を詳しく説明します

目次1. ReactとAntdを組み合わせてログイン機能を実現2. ReactとAntdを組み合わせ...

vue3 のさまざまな構文形式を比較したサンプルコード

デフォルトのテンプレートメソッドはvue2に似ており、コンポーネント内のセットアップ関数を使用します...