Python / Hy with SQLite


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

Python と Hy の関係

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

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

コラム

Python の abstract syntax tree (抽象構文木)って何 ?

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/

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

python

pypysqlite.py

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()

ターミナル(あの黒い画面)から実行

python pypysqlite.py pysqlite

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

hy

hyhysqlite.hy

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)

ターミナル(黒い画面)から実行

hy hyhysqlite.hy hysqlite

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


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

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

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 実行環境にファイルを渡せば確認できる。

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

SQL コマンド

.schema
  • インサートされたデータの確認
SELECT * FROM tbl_Hy ;