【Python】MySQLに接続してデータを取得、表示してみる
おはようございます。
前回までに Ticker の情報を SQLite に登録してきたのですが、
やっぱり SQLite だとTicker みたいに激しくデータ登録をしてしまうと
データ検索でもロックが発生してしまってうまくないので MySQL を使おうかと思います。
プログラムは SQLite のサンプルプログラムを流用してとりあえずデータ表示をしてみます。
スポンサーリンク
新規プロジェクトの作成
PyCharmを起動し、上部メニューの「File」>「New Project」を選択し、
ウィザードに沿ってプロジェクトを新規作成します。
(今回は「MySqlSample」プロジェクトとしました。)
プログラムの移植
SQLiteのサンプルプログラムを流用します。
一通り(フォルダ構成)含む、ファイルを移植します。
フォルダ構成:
MySqlSample
│ server.py
├─static
│ ├─css
│ │ style.css
│ └─js
│ script.js
└─templates
index.html
MySQL用パッケージのインストール
上部メニューの「File」>「Default Settings」を選択します。
Default Setting画面が表示されるので、右上の対象プロジェクト環境を今回作成した環境に変更し、右側にある「+」ボタンをクリックします。
パッケージ検索画面で、「mysql」と検索します。
一覧に表示された「mysql-connector-python-rf」を選択して「Install Package」ボタンをクリックします。
同様に、「Tornado」パッケージもインストールしてください。
プログラムの修正
インポート宣言の追加
server.py
1 | importmysql.connector |
接続処理等の修正
DBへの接続方法、SQL文法、カラムの型など、
SQLiteとMySQLで違う箇所を修正します。
server.py(SQLiteUtil → MySQLUtilに変更)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | classMySQLUtil: """ MySQL操作用クラス """ @staticmethod defcreate_db(): """ データベース、及び必要なテーブルを作成します. """ logging.info("create database") withclosing(mysql.connector.connect( host="localhost", port="3306", user="USER01", password="USER01", database="DB01" ))asconn: c=conn.cursor() # 種別テーブル sql="CREATE TABLE IF NOT EXISTS MSTKIND (" sql+=" KIND_CD CHAR(2) NOT NULL" sql+=" , KIND_NAME VARCHAR(20)" sql+=" , PRIMARY KEY (KIND_CD)" sql+=")" c.execute(sql) # 猫テーブル sql="CREATE TABLE IF NOT EXISTS TBLCAT (" sql+=" NO INTEGER(2) NOT NULL" sql+=" , NAME VARCHAR(20) NOT NULL" sql+=" , SEX CHAR(3) NOT NULL" sql+=" , AGE INTEGER(1) DEFAULT 0 NOT NULL" sql+=" , KIND_CD CHAR(2) DEFAULT '00' NOT NULL" sql+=" , FAVORITE VARCHAR(40)" sql+=" , PRIMARY KEY (NO)" sql+=")" c.execute(sql) c.close() @staticmethod definsert_initial_data(): """ 各テーブルに初期データを登録します """ logging.info("insert initial data") withclosing(mysql.connector.connect( host="localhost", port="3306", user="USER01", password="USER01", database="DB01" ))asconn: c=conn.cursor() # 種別マスタ sql="REPLACE INTO MSTKIND (KIND_CD, KIND_NAME) VALUES (%s,%s)" kinds=[ ('01','キジトラ'), ('02','長毛種(不明)'), ('03','ミケ(っぽい)'), ('04','サビ'), ('09','その他'), ] c.executemany(sql,kinds) # 猫データ sql="REPLACE INTO TBLCAT VALUES (%s,%s,%s,%s,%s,%s)" cats=[ (1,"そら","♂",6,"01","犬の人形"), (2,"りく","♂",5,"02","人間"), (3,"うみ","♀",4,"03","高級ウェットフード"), (4,"こうめ","♀",2,"04","横取りフード"), ] c.executemany(sql,cats) c.close() conn.commit() @staticmethod defselect_kind_all(): """ MST種別のデータを全て取得します. :return: """ logging.info("select all kind") withclosing(mysql.connector.connect( host="localhost", port="3306", user="USER01", password="USER01", database="DB01" ))asconn: c=conn.cursor() sql="SELECT * FROM MSTKIND ORDER BY KIND_CD" c.execute(sql) returnc.fetchall() @staticmethod defselect_cat(name,kind_cd): """ 猫を検索します. :param name: :param kind_cd: :return: """ logging.info("select cat") withclosing(mysql.connector.connect( host="localhost", port="3306", user="USER01", password="USER01", database="DB01" ))asconn: c=conn.cursor(dictionary=True) # SQL組み立て sql="SELECT C.NO, C.NAME, C.SEX, C.AGE, C.KIND_CD, K.KIND_NAME, C.FAVORITE FROM TBLCAT C" sql+=" LEFT OUTER JOIN MSTKIND K ON ( C.KIND_CD = K.KIND_CD)" ifkind_cd=="": sql+=" WHERE C.NAME LIKE '"+name+"%'" else: sql+=" WHERE C.NAME LIKE '"+name+"%' AND C.KIND_CD = '"+kind_cd+"'" sql+=" ORDER BY C.NO" result=[] row={} c.execute(sql) forrinc.fetchall(): result.append({ "no":r['NO'], "name":r['NAME'], "sex":r['SEX'], "age":r['AGE'], "kind_name":r['KIND_NAME'], "favorite":r['FAVORITE'], }) returnresult |
起動してみる
無事に検索、データ表示することができました。
まとめ
ひとまず、データの表示までは簡単に移植できました。
次回は実際に Bitflyer の Ticker 情報を登録してみましょうかね。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません