kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

PPP3: パッケージ作成(続き)

03-03-07 README.rst: 開発環境セットアップ手順

README.rstにセットアップ手順を記載
rstはreStructuredTextの略
Markdownじゃないのは何かのお約束なのか単なるローカルルールなのか
見た目はMarkdownのほうが好きかなあ
見出しが目立つのはいいところかもしれない

続きを読む

PPP3: venvとpip

Chapter 03 Pythonプロジェクトの構成とパッケージ作成

パッケージングにもドキュメントがあるのね
Python Packaging User Guide — Python Packaging User Guide

ってないと困るだろうけど
読むべきものが多いのもそれはそれで大変
必要なところをつまみ食い的に読むのが苦手なので

続きを読む

HFP2: データベース関連

一応狙いは達成したけど返却までHead First Pythonを続ける
データベースのところやってみよう

普通にMySQLをインストールしようかと思ったけど
Oracleアカウントとやらで名前はともかく所属とか電話番号とか
必須で入れるのが面倒に感じて離脱
MariaDBでやってみよう

Q: MySQLの代わりにMariaDBを使いたいのですが。
A: MariaDBMySQLから派生しているので、代わりにMariaDBを使っても問題ありません。

ほぼMySQLらしいくらいの話は聞いたことあるけどどれくらい「問題ない」んだろう
接続方法とか操作方法とかまったく同じなんだろうか
同じソースのままPythonAnywhereに入れても動く?
まあやってみよう

あまり頭を使いたくないので mariadb-10.3.14-winx64.msi でインストール
いちおうrootパスワードは変更しておく
“Use UTF8”がデフォルトでオフになっているのはどういうことだろう
オンにした

Sevice Nameのデフォルトが“MySQL”だったり
説明に“mysql command line client”って書いてあったりしたから
そのまんまMySQLと思って使えばいいんだなきっと

というわけでドライバも本に書いてあるとおり
MySQL-Connector/Pythonを入れよう

$ pip3 install mysql-connector-python
Collecting mysql-connector-python
  :
Installing collected packages: six, protobuf, mysql-connector-python
Successfully installed mysql-connector-python-8.0.16 protobuf-3.7.1 six-1.12.0

しかしMySQL用のドライバだけでもいっぱいあるとは

データベース・テーブルを作成
mysqlクライアントにはパスが通っていない模様
スタートメニューの“Command Prompt (MariaDB 10.3 (x64))”を
選ぶとパスが設定されてるのでそこから起動

C:\Windows\system32>mysql -u root -p
Enter password: ********
Welcome to the MariaDB monitor.  Commands end with ; or \g.
  :
MariaDB [(none)]>

mysqlしか使わないなら“MySQL Client (MariaDB 10.3 (x64))”を起動すればOK

続いてデータベースと管理者アカウントを作成

MariaDB [(none)]> create database vsearchlogDB;
Query OK, 1 row affected (0.005 sec)

MariaDB [(none)]> grant all on vsearchlogDB.* to 'vsearch' identified by '***********';
Query OK, 0 rows affected (0.002 sec)

作ったアカウントでログインしなおしてテーブルを作成

MariaDB [(none)]> quit
Bye

C:\Windows\system32>mysql -u vsearch -p vsearchlogDB
MariaDB [vsearchlogDB]> create table log (
    -> id int auto_increment primary key,
    -> ts timestamp default current_timestamp,
    -> phrase varchar(128) not null,
    -> letters varchar(32) not null,
    -> ip varchar(16) not null,
    -> browser_string varchar(256) not null,
    -> results varchar(64) not null );
Query OK, 0 rows affected (0.026 sec)

MariaDB [vsearchlogDB]> describe log;
+----------------+--------------+------+-----+---------------------+----------------+
| Field          | Type         | Null | Key | Default             | Extra          |
+----------------+--------------+------+-----+---------------------+----------------+
| id             | int(11)      | NO   | PRI | NULL                | auto_increment |
| ts             | timestamp    | NO   |     | current_timestamp() |                |
| phrase         | varchar(128) | NO   |     | NULL                |                |
| letters        | varchar(32)  | NO   |     | NULL                |                |
| ip             | varchar(16)  | NO   |     | NULL                |                |
| browser_string | varchar(256) | NO   |     | NULL                |                |
| results        | varchar(64)  | NO   |     | NULL                |                |
+----------------+--------------+------+-----+---------------------+----------------+
7 rows in set (0.012 sec)

あとはPythonからアクセスする
こんな感じ

import mysql.connector

dbconfig = {
    "host": "127.0.0.1",
    "user": "vsearch",
    "password": "************",
    "database": "vsearchlogDB",
}

conn = mysql.connector.connect(**dbconfig)
cursor = conn.cursor()
_SQL = """describe log"""
cursor.execute(_SQL)
res = cursor.fetchall()
for row in res:
    print(row)
cursor.close()
conn.close()

fetchall()のかわりにfetchone()fetchmany()を使うこともできる
fetchallは常にタプルのリストを返す

SQL文字列には%s等のプレースホルダを使うことができる
けどString Interpolationみたいにしてほしいな
ないのかな
あ、でもタプルを返してくるってのと対になってるのか

データベースへの書き込みはキャッシュされる
conn.commit()で強制書き込み
これはトランザクションのコミットと思っていいのかしら
ロールバックもある?

HFP2:Python Anywhere

ゴールは、「付録B Python Anywhere Webアプリケーションのデプロイ」で
インターネット上になにか載せてみるところまでとする
載せられそうな最小限のアプリができたらやってみる

とか自分で考えることもなく、5章の最後でPython Anywhereへの
デプロイやるなら付録B見ろ、ってなってました
なおクラウドへのデプロイは必須ではなく、やらなくても
6章以降進んでいけるとのこと

続きを読む