データベースのダンプのみの単純な構造を作成しようとしています。 mysqldump
を使用すると、次のような結果が得られます。
_/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `foo`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
_
私が何を試みても、私はそれらのコメントを取り除くことができないようです。
私は現在使用しています:_mysqldump -p -d --add-drop-table --skip-tz-utc --skip-set-charset -h 127.0.0.1 -u foo bar --result-file=dumpfile.sql
_
編集:ただし、-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)
など、他のコメントを保持したい
わあ!これらはそのように見えても、実際にはコメントではありません。これらは条件付き実行トークンです。
この行を取る:
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
MySQLのバージョンが4.00.14以上の場合、MySQLサーバーはこのステートメントを実行します。
この魔法のコメント構文は、マニュアルの Comment Syntax セクションに記載されています。
おそらく、このようなものを取り除きたくないでしょう。
私はこれが古代の質問であることを知っていますが、少なくとも答えはここにあります。また、条件付きコメントを削除するためのmysqldumpのフラグ、または実際にこれらのコメントが表示される最小のmysqlバージョンを設定するためのより良いオプションが見つかりませんでした。それらをすべて破棄したい場合は、grepまたはsedを使用して削除できます(sedは空白行を残しますが、grepは削除しません)。
mysqldump ... | grep -v '^\/\*![0-9]\{5\}.*\/;$'
mysqldump ... | sed -e 's/^\/\*![0-9]\{5\}.*\/;$//g'
Mysqlのバージョンに依存するコメントを条件付きで削除したいという私自身の希望に答えるには、次のいずれかを使用します(<mysql5のすべてのコメントを削除します)。
mysqldump ... | grep -v '^\/\*![0-4][0-9]\{4\}.*\/;$'
mysqldump ... | sed -e 's/^\/\*![0-4][0-9]\{4\}.*\/;$//g'
--skip-comments
をお試しください
ありがとう
編集:
なるほど。
--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset
目的の結果が得られるまで、いくつかのオプションを削除してみてください。基本的に、これは--compact
なしの--skip-comments
と同じです。
--skip-comments
は、バージョンとスタッフに関するコメントを削除します。
ショートカットオプション--compact
?
情報はこちら 。
技術的には、削除しようとしている行はコメントではありません。最初にいくつかの変数を一時的に変更し、最後に前の値にリセットします。
--no-dataを使用しているので、あなたのケースではあまり有用ではありません(しかし、無害です)。
これらはコメントではなく、スクリプトのその部分の実行はmysqlのバージョンに依存します。
次のように「コメント部分」を削除できます
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */
に
SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0
読みやすいようにスクリプトを「快適」にします。
「コメント」で指定されたものより新しいバージョンで「快適な」スクリプトを実行しようとすると、エラーが発生します。
--dump-date = FALSEを使用します
OPが求めるものを正確に実行します。 (正確には、わかりません)
ソース: mysqldumpオプションの概要
編集:ちょっと待って、これがmeがOPではなく、ここを離れるのを探しているものだ...誰かがそれを使えるように:これは常に変更であるため、ソース管理を台無しにするこの日付変更線...
条件付きコメントを削除するなど、ダンプを正規化するためにこのスクリプトを作成しました: https://github.com/luissquall/dbdump 。
あなたがする必要があるのは:
npm install -g @luissquall/dbdump
# Redirect output to a file
dbdump -u user -p -d database > struct.sql
おそらく正規表現を実行して、40014や40111などを含む行を削除します。
Windowsを使用しているため、誰もより良い解決策を見つけられない場合は、代わりにPythonスクリプトを使用できます。
import re, sys
sql = sys.stdin.read()
regex = re.compile(r'/\*![^\n]* \*/;\n', re.M)
print regex.sub('', sql)
コマンドラインからの使用:
python program.py < your.sql > output.sql
次のような行をすべて削除します。
/*!....... */;
Structure.sqlファイルをgit/githubに含めようとしてこの答えにつまずいた場合は、db:structure:dumpを実行した直後に次のコードで自動インクリメントを削除できます。
# Remove beginning auto increments to prevent merge conflicts
filename = 'db/structure.sql'
File.atomic_write(filename) do |output|
File.open(filename, 'rb').each do |input|
output.write(input.gsub(/\s+AUTO_INCREMENT=\d+\s+/, ' '))
end
end
別のオプション。vi/ vimを使用していて、ステートメントcontentsを保存するために迅速で汚い方法が必要であるが、括弧付きのコメントを消す必要がある場合:
: %s/\/\*!\d\+\s//g
: %s/\*\///g
(mysqldump
sでのみ安全です。エンディング*/
commentマーク、ただし少なくとも5.5の時点では人間が読み取れるコメントは、行コメント構文を使用します--
)。