質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

2949閲覧

【Go】gormを使った二つのテーブル削除方法により生じる違いについて

t.ozawa

総合スコア8

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/03/11 08:30

以下のモデルがあり、それに基づいたテーブルが作成されている場合、

type User struct { gorm.Model Name string `gorm:"size:255"` Password string `gorm:"size:255"` Email string `gorm:"size:255"` }

goのormフレームワークであるgormを使ってテーブルを削除しようとすると、db.DropTable(&User{})db.DropTable("users")の二つの選択肢があるかと思いますが、これら二つの違いを教えていただけないでしょうか?

db.DropTable(&User{})はUserモデルを削除するため、前述のモデルをコメントアウトすると実行できなくなり、db.DropTable("users")は指定した文字列に該当するテーブル自体を削除するため、モデルをコメントアウトしても実行できることは判明していますが、それ以外で機能的な違い(例えば、処理をするときの負荷など)があればご教示いただけると幸いです。(できれば、運用上の使い分けも含めて)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

DropTable のインターフェース型の値として、文字列を渡すか、モデルの struct を渡すにしても、結局以下から呼び出される DROP TABLE ステートメントが実行されます。
計測したわけではないですが、性能としてはほぼ変わらないのではないでしょうか?

go

1func (scope *Scope) dropTable() *Scope { 2 scope.Raw(fmt.Sprintf("DROP TABLE %v", scope.QuotedTableName())).Exec() 3 return scope 4}

https://github.com/jinzhu/gorm/blob/master/scope.go#L1198-L1201

運用的な違いが大きいと個人的には思います。
モデルに以下のメソッドを実装させて、モデルに対応するテーブル名を明示的に指定しておくのが柔軟でおすすめです(が人によって好みが分かれるところでもありそうです)。

go

1func (u User) TableName() string { 2 return "m_user" // 任意の文字列 3}

文字列で "users" などと指定するのは、定義しているモデルの struct との対応が分かりにくいので、あまりおすすめできないです。

ちなみに、上記のメソッドは gorm の tabler インターフェースの実装です。

go

1type tabler interface { 2 TableName() string 3}

https://github.com/jinzhu/gorm/blob/master/scope.go#L305-L307

投稿2020/03/15 13:01

編集2020/03/15 13:04
d_tutuz

総合スコア730

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t.ozawa

2020/03/21 04:54

丁寧な回答ありがとうございました! とても参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問