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: MariaDBはMySQLから派生しているので、代わりに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()
で強制書き込み
これはトランザクションのコミットと思っていいのかしら
ロールバックもある?