Python / Hy with SQLite

# Python と Hy の場合での SQLite データベースを使うときの対照サンプルコード。

## Python と Hy の関係
Hy とは python の abstract syntax tree に Lisp  言語のシンタックスである S 式を変換して python コードとして実行する S 式を用いた言語。

ちょっとなんのことかわからない。やってみたら、こういうこと。
下のスクリーンショットは、Hy で書いた S 式プログラム（上部）の実行時、python コード（下部）へ変換されている様子を表している。

![Screenshot_20211022-145341_kindlephoto-12047076.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/117346ef-5121-634e-cdb4-8f4ac78d8179.png)

## コラム

<details><summary>Python の abstract syntax tree （抽象構文木）って何 ?</summary>
<div>

https://qiita.com/intermezzo-fr/items/3ae7645bd7d4414d9607

https://ja.m.wikipedia.org/wiki/%E6%96%87%E8%84%88%E8%87%AA%E7%94%B1%E6%96%87%E6%B3%95

https://www.krrk0.com/context-free-grammar/

https://www.momoyama-usagi.com/entry/info-automaton07

（「Python の abstract syntax tree （抽象構文木）って何 ?」で検索するとよか。）

Hy の紹介と共に 作者の Paul Tagliamonte へのインタビュー （ 2013-15 年辺りの）が掲載されている

https://julien.danjou.info/the-hacker-guide-to-python-third-edition/

https://www.pythonpodcast.com/episode-23-hylang-core-developers/

木（抽象構文木） てなんだろ ?

https://www.lambdanote.com/products/ruby-ruby

構文木のある風景

https://i.loveruby.net/ja/rhg/book/syntree.html

>Speaker: Paul Tagliamonte

>This talk will cover the internals of Python, such AST, Import hooks, creating a console, and a very brief overview of Python internal formats (such as pyc files), by way of looking over the implementation of a Lisp called "Hy". No Lisp knowledge is required.

>Slides can be found at: https://speakerdeck.com/pycon2014 and https://github.com/PyCon/2014-slides

https://youtu.be/AmMaN1AokTI?t=355

Web インタプリター
https://hylang.github.io/hy-interpreter/

</div></details>

## コマンドラインから、入力された文字列を含む SQLite データベースファイルを作るサンプル。

### python

pypysqlite.py

```python:pypysqlite.py
import sqlite3
import os
import sys


SQL = """
create table tbl_Py (
    id INTEGER PRIMARY KEY,
    url text,
    title text
    );
"""

current_name = sys.argv[1]

db = sqlite3.connect("Py_" + current_name + ".db")

cur = db.cursor()

db.execute(SQL)
db.commit()
```

ターミナル（あの黒い画面）から実行

```terminal 
python pypysqlite.py pysqlite
```

Py_pysqlite.db というデータベースファイルが作られる。

### hy
hyhysqlite.hy

```hylang:hyhysqlite.hy
(import sqlite3)
(import os)
(import sys)

(setv SQL "create table tbl_Hy (id INTEGER PRIMARY KEY,url text,title text)")

(setv current-name (get sys.argv 1))

(setv db (.connect sqlite3 (+ "Hy_" current-name ".db")))
(setv cur (.cursor db))

(.execute db SQL)
;;(db.execute SQL)
(.commit db)
;;(db.commit)
```

ターミナル（黒い画面）から実行

```terminal
hy hyhysqlite.hy hysqlite
```

Hy_hysqlite.db というデータベースファイルが作られる。

----

## データベースにデータをインサートするサンプル
### python

```python:pypysqlite.py
count = 1
url = "https://qiita.com/dauuricus/items/d8bd9d3301409f51c64e"
title = "Python / Hy with SQLite"

cur.execute("insert into tbl_Py(id,url,title) values(?,?,?) ;",[count,url,title])

db.commit()
```

### hy

```hylang:hyhysqlite.hy
(setv count 1
        url "https://qiita.com/dauuricus/items/d8bd9d3301409f51c64e"
        title "Python / Hy with SQLite")

(cur.execute "insert into tbl_Hy(id,url,title) values(?,?,?)" 
    [count url title])

(.commit db)
;;(db.commit)
```

----

SQLite のメリットは、データベースがファイルなので、これはデメリットでもあるかもしれないが、パスワードや所有者の限定なく閲覧と編集が可能。

例えば、SQLite の実行プログラムがなくてもオンラインの SQLite 実行環境にファイルを渡せば確認できる。

https://sqliteonline.com/

* データベースの構造の確認。テーブル、コラム、データタイプ。

SQL コマンド

```sql
.schema
```

* インサートされたデータの確認

```sql
SELECT * FROM tbl_Hy ;
```