Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement a schemadeploy command #52

Open
wants to merge 5 commits into
base: master
from

Conversation

@lestrrat
Copy link
Contributor

commented Feb 9, 2018

No description provided.

@lestrrat

This comment has been minimized.

Copy link
Contributor Author

commented Feb 9, 2018

とりあえず書いてみた。テストは多少ある

@soh335 soh335 self-requested a review Feb 13, 2018

@soh335

This comment has been minimized.

Copy link
Member

commented Feb 13, 2018

schemadeploy と git-schemalex と挙動変わってるので、別ツールとして提供して行くって感じの方がいいですかねぇ。

前者は、mysql を見て、指定した ( git の commit でも可)ものをデプロイする

となっていて、

後者は、mysql に入っている git の version から git 経由でスキーマを見て、一応 HEAD のスキーマがデプロイされる

となっているので。

利用者から見た挙動は変わらないはずですけど、前者で HEAD を指定した場合、git rev-parse HEAD で HEAD の commit, 後者はファイルの最新の変更の commit になっているので、必ずしも HEAD の commit ではないというところが違いますね。(db.version == deploy.version にはならないけど、結局 diff は出ないから)

git-schemalex は gitddl をそのまま持ってきているので、どちらが良い悪いという話ではないです。

}

func deployVersion(ctx context.Context, tx *sql.Tx, hash string) error {
if _, err := tx.Exec(`CREATE TABLE schemadeploy_version (version VARCHAR(40) NOT NULL)`); err != nil {

This comment has been minimized.

Copy link
@soh335

soh335 Feb 13, 2018

Member

if not exists にしないとダメですね。

source.go Outdated
@@ -164,6 +165,8 @@ func (s mysqlSource) MySQLConfig() (*mysql.Config, error) {
if err != nil {
return nil, errors.Wrap(err, `failed to load X509 key pair`)
}

log.Printf("tlsname = %s", tlsName)

This comment has been minimized.

Copy link
@soh335

soh335 Feb 13, 2018

Member

debug ようですかね

@lestrrat

This comment has been minimized.

Copy link
Contributor Author

commented Feb 13, 2018

前者は、mysql を見て、指定した ( git の commit でも可)ものをデプロイする

あれ、なんか違ってるのか。テストが通ったのでこれでいいかと思ってました!テストがあれば…! :D

@soh335

This comment has been minimized.

Copy link
Member

commented Feb 13, 2018

https://github.com/schemalex/git-schemalex/blob/master/gitschemalex_test.go 今のやつもこれから持ってきたと思うんですけど、ざっくりしかないですからねぇ

@lestrrat

This comment has been minimized.

Copy link
Contributor Author

commented Feb 15, 2018

@soh335 #52 (comment)
これの件は挙動が変わるとgit-schemalexをすでに使ってる場所では導入されなくなっちゃいそうですかね?

@soh335

This comment has been minimized.

Copy link
Member

commented Feb 16, 2018

ちょっとまってくださいね。
https://github.com/winebarrel/ridgepole これも似たような雰囲気を感じますが、これは mysql 直接と比較してるのかな。

@soh335

This comment has been minimized.

Copy link
Member

commented Feb 17, 2018

ridgepole は dsl 同士の比較っぽいですね。

それはさておき、聞いてきたところによると

mysql が吐くスキーマとこちらが手書きしたスキーマだと意図しない差分が出る可能性があるので(シノニム系の統一とかが大変)、あくまでも mysql に入っているバージョンからその時の手書きしたスキーマを取得し、比較したほうが良いのではないかという話がありました。

それはその通りだと思いました。

mysql の吐く現在のスキーマと差分が適用できるので便利そうという話もありましたが、これは schemadiff mysql /path/to/file で出したものを適用すれば良いのではないかという話をしました。

この話をして考えたことなのですが gitddl の挙動にするなら

  • 適用する diff を表示するモード(ドライラン的な)
  • バージョンを記録するテーブルの名前が変えられる

あたりも必要かなぁと思いました。

lestrrat added some commits Feb 9, 2018

Change how statements are deployed
macopy pointed out:
default valueに `;` 入ってたら詰む???
単純にセミコロンで区切るのだと

So very true. Therefore in this commit we take the parsed result
from schema and use that to separate ut each statement. This requires
that the diff package gives us a way to get list of statements, and
not a string with all statements lumped up into a single string.
To allow this, a new function diff.Diff has been introduced

@lestrrat lestrrat force-pushed the topic/schemadeploy branch from d1b4ccf to 77a619f Feb 18, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
2 participants
You can’t perform that action at this time.