Python Pycharm MySQL

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はhostuserpasswordの3つを指定して、サーバーにログインします。

そのあと、cursorオブジェクトを生成してから16行目でCREATE DATABASEコマンドを使って、test_mysql_dbという名前のデータベースを作成しています。

最後の2行でカーソルとコネクタを終了しています。

このコマンドを実行したあと、ターミナルでshow databases;を実行してみると、新しくデータベースが作成されていることがわかります。

Python Pycharm MySQL データベースの作成

テーブルを追加

続いて作成したデータベースにテーブルを作っていきます。

新しくデータベースを作成したので、次からのコネクタは引数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行目までは省略していますが、データベースを作成した最初のコードと同じく、mysqlconfigをインポートしてユーザー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;を実行します。

Python Pycharm MySQL テーブルの作成

作成したテーブルがどのように作成されたのかが表示されています。

レコードを追加

テーブルを作成したら次はレコードを追加したあと、テーブルのデータを表示します。

レコードの追加コマンドは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;を実行すれば次のように表示されます。

Python Pycharm MySQL レコードの追加

レコードの値変更・削除

レコードの値を変更するコードや削除するコードはSQLiteと同じになります。

cursor.execute('UPDATE persons set name = "Michel" WHERE name = "Mike"')
cursor.execute('DELETE FROM persons WHERE name = "Michel"')

personsテーブルからMikeMichelに変更するコードと、personsテーブルからMichelを削除するコードです。

かなりハマった

昨日のユーザー作成や権限の付与でもかなりハマってしまいましたが、今日はテーブルの作成でどっぷりとハマってしまいました。

コードが間違っているわけではないのになぜかエラーが起こって、色々と試してもうまくいかず、最終的にIF NOT EXISTSを加えることでうまくテーブルを作成できました。

その後、IF NOT EXITSなしだとエラーになるのか試してみたのですが、今度はうまくテーブルを作成することができました。

一体何だったんだろうと思いながらも色々と試したので、少しはMySQLに慣れることができました。

明日は、テーブル作成でハマったところを健忘録的に記録しておこうと思います。

それでは、明日もGood Python!