Python学習【365日チャレンジ!】141日目のマスターU(@Udemy11)です。
大きい魚を諦めてアジングに出かけたら、適度に釣れて癒やされました。
サイズは20cm前後なんですが、細糸とアジングロッドを使っているので、いい感じの引きで楽しめるんです。
それにこのサイズだとアジフライにするとめっちゃ美味しいんですよね。
それでは、今日もPython学習を始めましょう。
昨日の復習
昨日は、最も有名なリレーショナルデータベースであるMySQLについて学習しました。
MacにMySQLをインストールして、ターミナルから新しいユーザーを作成し、データベースに関する権限を与えてログインできるようにするところまで学習しました。
簡単な説明をするためにMySQLを使うだけなら、初期設定でパスワードが設定されていないrootユーザーを使っても問題はありませんが、今後の運用を考えて、ユーザーを作ることろから権限を与えるところまで実践しました。
今日の学習に入る前に、昨日学習した内容をチェックしておいてください。
それでは、MySQLの続きを学習しましょう!
ターミナルでMySQLにログイン
まずは、ターミナルでMySQLを稼働させて、新しく作ったユーザーでログインしておきましょう。
MySQLをスタートさせるには、コマンドbrew services start mysql
を実行します。
新しく作ったユーザーでMySQLにログインするには、コマンドmysql -u ユーザー名(masteru) -p
として、からパスワードを入力してログインしました。
ここまでの準備完了後、Pythonファイルでコードを書いていきます。
データベースの作成
昨日インポートしたmysql-connector-python
をインポートして、データベースを操作していきます。
import mysql.connector
import config
test_id = config.test_mysql_id
test_pass = config.test_mysql_pass
conn = mysql.connector.connect(host='localhost',
user=test_id,
password=test_pass)
cursor = conn.cursor()
cursor.execute('CREATE DATABASE test_mysql_db')
cursor.close()
conn.close()
今回もconfig.py
にユーザーIDとパスワードを保存して読み込む形にしています。
config.py
test_mysql_id = 'masteru'
test_mysql_pass = 'パスワード'
ユーザーIDとパスワードは、昨日の学習でMySQLで作成したものを活用しています。
SQLiteのときと同じように、10行目から12行目でコネクタオブジェクトを生成しますが、SQLiteがデータベースを引数に指定したのに対して、MySQLはhost
、user
、password
の3つを指定して、サーバーにログインします。
そのあと、cursor
オブジェクトを生成してから16行目でCREATE DATABASE
コマンドを使って、test_mysql_db
という名前のデータベースを作成しています。
最後の2行でカーソルとコネクタを終了しています。
このコマンドを実行したあと、ターミナルでshow databases;
を実行してみると、新しくデータベースが作成されていることがわかります。
テーブルを追加
続いて作成したデータベースにテーブルを作っていきます。
新しくデータベースを作成したので、次からのコネクタは引数database
を加えます。
conn = mysql.connector.connect(host='localhost',
user=test_id,
password=test_pass,
database='test_myspl_db')
cursor = conn.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS persons('
'id int NOT NULL AUTO_INCREMENT,'
'name varchar(14) NOT NULL,'
'PRIMARY KEY(id)')
conn.commit()
cursor.close()
conn.close()
9行目までは省略していますが、データベースを作成した最初のコードと同じく、mysql
とconfig
をインポートしてユーザーIDとパスワードを変数に代入します。
10行目のコネクタオブジェクトには、新しい引数database
に、先程作成したデータベース名を指定し、cursor
オブジェクトを生成しています。
次のexecute
は、少しSQLiteとは違った命令文になっています。
IF NOT EXISTS
があったり、空白ではないNOT NULL
を指定したり、文字列をvarchar(14)
で指定したり、PRIMARY KEY
の指定の仕方であったり、違うところがいくつかあります。
21行目のconn.commit()
でテーブルに書き込むのは同じで、最後もカーソルとコネクタを閉じて終了します。
テーブルを確認
テーブルを確認するには、ターミナルでuse test_mysql_db;
を実行して、データベースを選択したのち、show create table persons;
を実行します。
作成したテーブルがどのように作成されたのかが表示されています。
レコードを追加
テーブルを作成したら次はレコードを追加したあと、テーブルのデータを表示します。
レコードの追加コマンドはSQLiteと同じになります。
cursor.execute('INSERT INTO persons(name) values("Mike")')
cursor.execute('INSERT INTO persons(name) values("Jhon")')
cursor.execute('INSERT INTO persons(name) values("Kate")')
conn.commit()
cursor.execute('SELECT * FROM persons')
for row in cursor:
print(row)
16行目まではテーブルを作成したコードと同じです。25行目以降は、カーソルのクローズとコネクターのクローズを忘れずに入れましょう。
SQLiteと違うのは、カーソルのオブジェクト名がcurs
からcursor
に変わっているだけなので、オブジェクトの名前を同じにしていれば、全く同じコードになります。
conn.commit()
でテーブルに保存したあと、テーブルのレコードを抽出してfor
ループでprint
表示しています。
出力結果は次のようになります。
(1, 'Mike')
(2, 'Jhon')
(3, 'Kate')
ターミナルでテーブルを表示するには、コマンドselect * from persons;
を実行すれば次のように表示されます。
レコードの値変更・削除
レコードの値を変更するコードや削除するコードはSQLiteと同じになります。
cursor.execute('UPDATE persons set name = "Michel" WHERE name = "Mike"')
cursor.execute('DELETE FROM persons WHERE name = "Michel"')
persons
テーブルからMike
をMichel
に変更するコードと、persons
テーブルからMichel
を削除するコードです。
かなりハマった
昨日のユーザー作成や権限の付与でもかなりハマってしまいましたが、今日はテーブルの作成でどっぷりとハマってしまいました。
コードが間違っているわけではないのになぜかエラーが起こって、色々と試してもうまくいかず、最終的にIF NOT EXISTS
を加えることでうまくテーブルを作成できました。
その後、IF NOT EXITS
なしだとエラーになるのか試してみたのですが、今度はうまくテーブルを作成することができました。
一体何だったんだろうと思いながらも色々と試したので、少しはMySQLに慣れることができました。
明日は、テーブル作成でハマったところを健忘録的に記録しておこうと思います。
それでは、明日もGood Python!