MasaのITC Life

夢は起業家!全てにおいて凡人だけど頑張ることだけはいっちょ前!

プログラミング

【Go言語】データベース(SQLite3)にR/Wする方法!(QueryRowなど)

投稿日:2020年8月11日 更新日:



Goでデータベースを操作するには、

データベースに適したドライバーを

インポートする必要があります。



今回はSQLite3ですので、

こちらからもってくることが出来ます。

go get github.com/mattn/go-sqlite3


あとは、SQLite3

インストールして準備完了です。




それでは実際に使ってみましょう。


コード内で行っていることは、

データベースにユーザ情報を登録して

データベースに検索をかけています。




saveUserInfo2DB関数

データベースへの登録を行う。



checkValidity関数

メールアドレスとパスワードに該当する

ユーザidをデータベースから取得する




id、email、パスワード、名前の情報を持つ

UserInfo構造体を定義しています。



本来はクライアントからの

入力を保存しますが今回は、

main文内で指定しています。



SQLiteやPostgresなどのRDBSは、

sql.Open()して、SQL文を実行

という簡単な流れです。

Closeするのをお忘れなく。




SELECT文を使うときは、

Queryメソッドを使います。



ちなみにQueryメソッドは、

検索にヒットしなかったら、

エラーが返って来そうですが、



ヒットしなくてもnilが返ってきます。

sql文に不備があるとエラーを返します。



条件に合うレコードが複数あると、

複数のタプルが返ってきます。

Nextメソッドで個々を

対象とすることが出来ます。



また、取得したタプルは、

Scanメソッドを使うことで、

引数に指定した変数に代入出来ます。



注意ですが、Scan()の引数に渡す際は、

"ポインタ"を渡さないと上手く動作しません。



また、カラムの型と

引数のポインタが指す変数の型が、

それぞれ一致しないとエラーが返ります。



万が一、期待せぬことに、

ユーザ情報のレコードが2つヒットすると、

2行目の情報が最終的な値になります。



rows.Scan()で1レコード目が

2レコード目によって上書きされるからです。



上の例とは違って、

複数のレコード情報が欲しい場合は、

多重スライスを作って、

rows.Next()でループが回るたびに、

append()などしていく必要があります。





今回は紹介のためにあえて、

Queryメソッドを使いましたが、

条件に1列しかマッチしないのが

自明である場合などは、

QueryRowメソッドを使用します。




そこでQueryRowを用いた

別の例を見てみましょう。



ユーザIDを引数として、

それがデータベースに登録されているか

真偽を確かめる場合です。


ユーザIDの有無を確かめる



あるかないかを確認するだけなので

True or Falseが欲しいです。





QueryRowに、SELECT EXIST ... で

データベースに検索をかけます。



そしてScanメソッドを使うことで、

真偽の結果が分かります。

なければエラーとしてかえってきます。



ユーザIDがあればexisitには、

Trueが入っています。






以上です。

最後まで読んでいただきありがとうございました。




参考 : https://pkg.go.dev/database/sql?tab=doc#example-DB.Prepare
参考 : https://golang.shop/post/go-databasesql-04-retrieving-ja/



-プログラミング

Copyright© MasaのITC Life , 2023 All Rights Reserved Powered by STINGER.