2018-01-14

Python3 データをMySQLに挿入する

目的

・自動更新サイトを作るときに、PythonでMySQLに外部サイトからスクレイピングしたデータを利用して、記事を自動生成したい


メリット


・今まではSeleniumで取得したデータをPandasに入れてCSVにエクスポートし、DBの代わりにしていたが、WebアプリケーションだとCSV利用には限界がある。(ほとんどのWebアプリはDBを使い、CSVは使わないから)

やりたいこと


  • PythonでSeleniumを利用して、Web上のデータをスクレイピング(ただし今回はスクレイピングのコード含めると面倒くさいので、やらない)
  • MySQLのあらかじめ作っておいたテーブルに保存

環境

  • Ubuntu 
  • Python3


Python用MySQLのライブラリ


Python用のMySQLのライブラリは色々出ているよう。

  • mysql-connector-python
    • Oracle(MySQL公式)
  • MySQLdb
    • AndyDustman
  • PyMySQL
  • MySQL-python
  • oursql
  • umysql

今回はOracle公式のmysql-connector-pythonを利用することにする。

実行手順


  1. まずUbuntuにMySQLを入れる。
  2. MySQLに適当なデータベースと、テーブルを作成する
  3. PythonでMySQLを利用できるパッケージをもろもろ入れる
  4. データをPython上でMySQLにInsertする

まずUbuntuにMySQLを入れる。


UbuntuにMySQLを入れるのはこのサイトを参考にして進めた。

途中で

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

というエラーが出たので、これを参考にして直した。




MySQLに適当なデータベースと、テーブルを作成する


まず、MySQLにターミナル上でログイン

$ mysql -u root -p 

パスワードを求められるので、MySQL作成時に利用したパスワードを入力

データベースを作成する

$ CREATE DATABASE hogedb;

これでデータベースの作成が完了する。
そのデータベースを利用する

$ use hogedb; 

データベースは複数のテーブルを持つことができ、このテーブルが実際にデータを入力する場所となる。テーブルを作成する。


$ CREATE TABLE production (
    id INT(11) AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title text,
    content text,
    address text,
    term text,
    owner text,
    fee text,
    contact text,
    homepageURL text,
    );


作成されたか確認。
作成されたデータベースのカラムを確認することができる。

$ show fields from production;

作成したカラムが追加されていればOK  


PythonでMySQLを利用できるパッケージをもろもろ入れる


このページの手順にしたがって、PythonでMySQLを利用するもろもろのパッケージをインストール。


データをPython上でMySQLにInsertする


まずはインストール


$ pip install mysql-connector-python


もろもろの値をtitle, content etcに入れて、実行するとmysqlに接続され、実際にデータを挿入することができる。


忘れていけないのは、UPDATE, POST, DELETEのアクションでは、commitをしないとデータの変更が修正されない(単純にGETのものはcommitはいらない)


execute.py


import mysql.connector 

#SQL 設定
table_name = "production"
db_settings = {
    "host":"localhost",
    "database":"hogedb",
    "user":"root",
    "password":"your_password",
    "port":3306
}

title = ""
content = ""
address = ""
term = ""
place =""
owner = ""
fee = ""
contact = ""
homepageURL = ""

conn = mysql.connector.connect(**db_settings)
cur = conn.cursor()

cur.execute(
    """
    INSERT INTO production(
        title = ""
        content = ""
        address = ""
        term = ""
        place =""
        owner = ""
        fee = ""
        contact = ""
        homepageURL = ""
    )
    VALUES ("{}","{}","{}","{}","{}");
    """.format(title,content,address,term,place,owner,fee,contact,homepageURL)
    )

cur.close
conn.commit()
conn.close

データが挿入されたかどうかは、MySQLにアクセスして確認してみればわかる。


$ mysql -u root -p
$ use hogedb;
$ select count(id) from production; #idの個数を取得


個数が挿入した行の数であれば、ちゃんとデータベースに入力されたことになる。










注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...