#まず
echoに関する質問3回目です。
いつもお世話になってます。
#やったこと
gormを少し触りました。
当方DBを扱ったことがないのでなんとなくですが。
gormのドキュメントを真似してファイルを作ることはできました。
以下該当コード
DB関係は別パッケージに切り出しました。
まずmain.goで関数を呼び出す部分
go
1e.GET("/api/register", func(c echo.Context) error { //アクセスするだけでいいため、とりあえずGETにしています 2 plugin.CreateDB() //下記で示す関数です 3 return c.Render(http.StatusOK, "index", nil) //特に何も返したくない場合何を書けばいいのかわからなかったので、適当に書きました 4 })
CreateDB関数(このような関数は実際には必要ないかと思われますが、テストなのでファイルを作るだけの関数を用意しました)
go
1type Product struct { //おそらくDBの形式を模した何か(?) 2 gorm.Model 3 Code string 4 Price uint 5} 6 7func CreateDB() { 8 db, err := gorm.Open("sqlite3", "test.db") //ファイル作成 9 if err != nil { 10 panic("failed to connect database") 11 } 12 defer db.Close() 13 db.Create(&Product{Code: "L1212", Price: 1000}) //先ほどの構造体を利用して書き込み 14}
このような感じです。
#質問
- go-sqlite3はどのようにgormと併用すればいいのか
- ドキュメントでは何故か
_ "github.com/jinzhu/gorm/dialects/sqlite"
がインポートされていたがそれはなんなのか
が知りたいです。
#ログインのサブミットに関して
サブミットの処理はhtmlで"/api/login"にpostするようにして、go側のe.POST()の中にDB関係の処理を書けばいいのかなと思っています。
なのでDBに関してを勉強しているというわけです。
#追記
・GORMのCreateについて
そもそも、GORMのCreateというのは、データベースのテーブルを作るという意味でしょうか?
つまり、
go
1db.Create(&Product{Code: "L1212", Price: 2000}) 2db.Create(&Product{Code: "L1213", Price: 3000}) 3db.Create(&Product{Code: "L1214", Price: 4000}) 4db.Create(&Product{Code: "L1215", Price: 5000}) 5db.Create(&Product{Code: "L1216", Price: 6000}) 6db.Create(&Product{Code: "L1217", Price: 7000})
このようなコードを実行すると、
Code | Price |
---|---|
L1212 | 2000 |
L1213 | 3000 |
L1214 | 4000 |
L1215 | 5000 |
L1216 | 6000 |
L1217 | 7000 |
こういったテーブルを作成するということでしょうか。
・マッピングとは
マッピングとは噛み砕くとどういう処理でしょうか?
ORM(オブジェクト関係マッピング)特有の用語なのかなというのはわかるのですが。。
go
1db.AutoMigrate(&Product{})
このコードはどういう場合(タイミング)に書くものなんでしょうか?
・Readについて
go
1var products []Product 2// Get all records 3db.Find(&products) 4//// SELECT * FROM products;
これはProductテーブル内の全てのレコードを取得するという意味かと思うのですが
セレクトしたものをプリントしようとして
go
1aa := db.Find(&products) 2fmt.Println(aa)
こう書いたのですが、
&{0xc420179280 <nil> 6 0xc420174dc0 false 0 {0xc4200fbf40} 0xc420418420 map[] 0xc42016f710 <nil> <nil> false}
このように出力されました。
これは、SELECTによって取得したものは、DBの操作でしか扱えない(型の問題上)ということなんでしょうか。
・go-sqlite3パッケージについて
mattnさんは回答において、go-sqlite3パッケージの関数等を直接使ってらっしゃらないと思うのですが、go-sqlite3はどこで使うのですか?
それとも、
go
1//db, err := gorm.Open("ドライバ名称", "接続文字列") 2db, err := gorm.Open("sqlite3", "foo.sqlite")
go-sqlite3はドライバという役割であって、GORMと併用する場合は直接使わないものなんですかね?
質問攻めすみません。
#追記2
とりあえず、gormを使ってDBにレコードを作ることはできるようになりました。
あとややこしく考えていましたが、GORMは、単純にGo言語でsqlを楽に扱うためのライブラリってことに気がついて気が楽になりました。
レコード作成はこうですね!↓(質問ではないので軽く見流していただければ結構です 汗)
go
1type UserData struct { 2 gorm.Model //ここにCreatedAtがあるのでタイムスタンプは任せればいいですね。 3 Userid string 4 Password string 5} 6 7func main() { 8 saveUserData("DDxlk", "DDxlkDayo") 9} 10 11func SaveUserData(userid, password string) { 12 db, err := gorm.Open("sqlite3", "test.sqlite3") 13 if err != nil { 14 panic("failed to connect database") 15 } 16 defer db.Close() 17 // Migrate the schema 18 db.AutoMigrate(&UserData{}) 19 // Create 20 user := &UserData{Userid: userid, Password: password} 21 db.Create(&user) 22}
###質問1
useridとpasswordをhtmlのフォームからechoに送ってdbに登録するわけですが、dbに何も書き込まれません(レコードのuseridとpasswordの部分が空白になってしまいます)
registration.html(登録)のフォームの部分が以下です
html
1<form action="/api/register" method="post" name="registration_form"> 2 <input type="text" name="userid" id="userid_form"/> 3 <input type="password" name="password" id="password_form"/> 4 <input type="hidden" name="register" value="register"> 5 <a id="login_button" onclick="document.registration_form.submit();return false;">Register</a> 6 </form>
そして、打ち込まれたuseridとpasswordをdbに登録する処理が以下です
go
1//echo 2e.POST("/api/register", func(c echo.Context) error { 3 id := c.Param("userid") //フォームからidを取得しているつもり 4 password := c.Param("password") //フォームからpasswordを取得しているつもり 5 SaveIdOnDB(id, password) 6 return c.Render(http.StatusOK, "index", nil) 7)} 8 9type UserData struct { 10 gorm.Model 11 Userid string 12 Password string 13} 14 15func SaveUserData(userid, password string) { 16 db, err := gorm.Open("sqlite3", "test.sqlite3") 17 if err != nil { 18 panic("failed to connect database") 19 } 20 defer db.Close() 21 // Migrate the schema 22 db.AutoMigrate(&UserData{}) 23 // Create 24 user := &UserData{Userid: userid, Password: password} 25 db.Create(&user)
###質問2
先ほどからtest.sqlite3の中にレコードを作成してるわけなんですが、レコードの値をコマンドラインに出力するにはどうすればいいのでしょうか。(先日コメントでも申し上げた通り、fmt.Printlnするとポインタの値が出力されます)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/11 10:28
2017/09/11 11:09 編集
退会済みユーザー
2017/09/11 14:25
退会済みユーザー
2017/09/11 15:07 編集
2017/09/11 15:26
退会済みユーザー
2017/09/13 11:47
退会済みユーザー
2017/09/14 07:54 編集
2017/09/14 08:11 編集
退会済みユーザー
2017/09/14 08:46