Juliaで学ぶプログラミング入門 IO/データベース/SQLite3 その１

# SQLiteとは
SQLite は、リレーショナルデータベース管理システム (RDBMS) の一種です。他には MySQL、PostgreSQL、Oracle Database などがあります。SQLite は、サーバーが必要ない軽量な RDBMS で、またオープンソースであるため、多くのプラットフォームで利用することができます。SQLite では、SQL という標準化されたデータベース言語を使用して、データベースを操作することができます。


# SQLiteの使用例
SQLite3 は、SQL データベースのマネージメントシステムです。Julia で SQLite3 を使用するには、まず SQLite.jl という Julia パッケージをインストールする必要があります。次に、以下のようにして SQLite3 データベースを操作できます。


```julia
using SQLite
# データベースに接続する
db = SQLite.DB("mydatabase.db")

# # テーブルを作成する
SQLite.execute(db, "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)")

# # データを挿入する
SQLite.execute(db, "INSERT INTO users (id, name) VALUES (1, 'Alice')")
SQLite.execute(db, "INSERT INTO users (id, name) VALUES (2, 'Bob')")

# # 以下はデータを取得できない
results = SQLite.execute(db, "SELECT * FROM users")

# # 100が返される
for result in results
    println(result) #100
end

# # データを取得する
db = SQLite.DB("mydatabase.db")
query = "SELECT * FROM users"
results = DBInterface.execute(db, query)

# # 結果を表示する
for result in results
    println(result)
end

#=
SQLite.Row:
 :id    1
 :name   "Alice"
SQLite.Row:
 :id    2
 :name   "Bob"
=#

# データベースの接続を終了する
SQLite.close(db)
```

上記のコードは、名前が Alice と Bob の 2 人のユーザーを含む users テーブルを作成し、それらをデータベースから取得する例です。

## 結果はイテレーター

上記のresultsはイテレーターです。
```
results = SQLite.query(db, "SELECT * FROM users")
```
### 結果は番号で取り出せる
```julia
# データを取得する
db = SQLite.DB("mydatabase.db")
query = "SELECT * FROM users"
results = DBInterface.execute(db, query)


# # 結果を表示する
for result in results
    println("#",result[1],":",result[2])
end
SQLite.close(db)

#=
#1:Alice
#2:Bob
=#
```
### アトリビュートでも取り出せる
```julia
# データを取得する
db = SQLite.DB("mydatabase.db")
query = "SELECT * FROM users"
results = DBInterface.execute(db, query)


# # 結果を表示する
for result in results
    println("#",result.id,":",result.name) #result["id"]はエラー
end
SQLite.close(db)

#=
#1:Alice
#2:Bob
=#
```
## closeするタイミング
当然ですがイテレーターなので元となっているDBを閉じられるとエラーになります。

```julia
# データを取得する
db = SQLite.DB("mydatabase.db")
query = "SELECT * FROM users"
results = DBInterface.execute(db, query)

#　# ここで閉じてしまうと。。。
SQLite.close(db)

# # 結果を表示するつもりが。。
for result in results
    println("#",result.id,":",result.name)
end

# SQLiteException("Statement 1 not found")
```

## DataFrameでデータを受け取る
 以下は結果を|> DataFrameでDataFrameに変換して受け取るとシンプルです。

```julia
using DataFrames
# データを取得する
db = SQLite.DB("mydatabase.db")
query = "SELECT * FROM users"

results_df = DBInterface.execute(db, query) |> DataFrame


# # 結果を表示する
println(results_df)

#終了する
SQLite.close(db)
```


## 参考図書
[１から始めるプログラミング](https://amzn.to/3HHR7Yv)
<a href="https://www.amazon.co.jp/1%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B-Julia%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%80%B2%E8%97%A4-%E8%A3%95%E4%B9%8B/dp/433902905X?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-1&linkCode=li3&tag=buzz06-22&linkId=8f7deba521f52f812d35ecdbe756cc10&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=433902905X&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=433902905X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

[Juliaプログラミングクックブック](https://amzn.to/3PFfb0a)
<a href="https://www.amazon.co.jp/Julia%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AF%E3%83%83%E3%82%AF%E3%83%96%E3%83%83%E3%82%AF-%E2%80%95%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%80%81%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%80%81%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97%E3%81%BE%E3%81%A7-Bogumi%C5%82-Kami%C5%84ski/dp/4873118891?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-2&linkCode=li3&tag=buzz06-22&linkId=4e34b4b620932164412ec18acff914a8&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873118891&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=4873118891" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

[天才プログラマー タンメイが教える Julia超入門](https://amzn.to/3FJRpeW)
<a href="https://www.amazon.co.jp/%E5%A4%A9%E6%89%8D%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-%E3%82%BF%E3%83%B3%E3%83%A1%E3%82%A4%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Julia%E8%B6%85%E5%85%A5%E9%96%80-Tanmay-Bakshi/dp/4807920219?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-10&linkCode=li3&tag=buzz06-22&linkId=bf79aa67b5c5956c8fd26f9436401dc6&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4807920219&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=4807920219" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />