0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

FlaskでSQLiteからMySQLへ書き換えてみた

Posted at

FlaskのチュートリアルではSQLiteを用いて掲示板アプリを作られていると思いますが、デプロイする際にMySQLに書き換える必要があったため書き換えたのでそれをここにも残しておこうと思います。

schema.sqlの書き換え

schema.sql
DROP TABLE IF EXISTS user;
DROP TABLE IF EXISTS post;

CREATE TABLE user (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL
);

CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  author_id INTEGER NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  FOREIGN KEY (author_id) REFERENCES user (id)
);
db_mysql.py
import MySQLdb
import os

def mysql():

    # 接続する 
    # ローカルでのDB用
    conn = MySQLdb.connect(
        unix_socket = '/Applications/MAMP/tmp/mysql/mysql.sock',
        user='root',
        passwd='root',
        host='localhost',
        db='flask',
        charset='utf8'
    )

    return conn

def create_table():

    conn = mysql()

    # カーソルを取得する
    cur = conn.cursor(MySQLdb.cursors.DictCursor)

    user_drop = "DROP TABLE IF EXISTS user"
    post_drop = "DROP TABLE IF EXISTS post"
    cur.execute(user_drop)
    cur.execute(post_drop)

    # テーブルの作成
    user_table = """
        CREATE TABLE user (
        id INTEGER AUTO_INCREMENT,
        password TEXT NOT NULL,
        username VARCHAR(10) UNIQUE,
        PRIMARY KEY (id)
        )
    """

    cur.execute(user_table)

    post_table = """
        CREATE TABLE post (
        id INTEGER AUTO_INCREMENT,
        author_id INTEGER NOT NULL,
        created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        title TEXT NOT NULL,
        body TEXT NOT NULL,
        PRIMARY KEY (id)
        )
    """

    cur.execute(post_table)

    cur.close
    conn.close

schema.sqlにはSQLiteでテーブル作成のコードが書かれています。それをdb_mysql.pyにMySQLで書き換えました。MySQLdbを使うため下記コマンドを打つ必要があります。

$ pip3 install mysqlclient

db.pyの書き換え

db.pyを少し書き換えました。flask init-dbコマンドをするとdb_mysql.pyのcreate_table関数が実行されテーブル作成が行われます。

db.py
import click
from flask import current_app, g
from flask.cli import with_appcontext
from . import db_mysql


def close_db(e=None):
    db = g.pop('db', None)

    if db is not None:
        db.close()

def init_db_mysql():
    db_mysql.create_table()

@click.command('init-db')
@with_appcontext
def init_db_command():
    """Clear the existing data and create new tables."""
    init_db_mysql()
    click.echo('Initialized the database.')


def init_app(app):
    app.teardown_appcontext(close_db)
    app.cli.add_command(init_db_command)

以上でテーブルの書き換えが完了したので、あとはデータを入れたり取ってくるコードを書き換える必要がありますね。全部書くのはあれなんで一部抜粋です。

blog.pyの書き換え

blog.py
conn = db_mysql.mysql()
db = conn.cursor(MySQLdb.cursors.DictCursor)
db.execute(
    'SELECT *'
    ' FROM post'
    ' WHERE post.id = %s',  
    (post_id,)
)
posts = db.fetchone()

connでDB接続、dbで操作準備、db.executeで操作、db.fetchoneで取り出す。

以上がsqliteからMySQLに書き換える流れです。

まとめ

若干SQLiteとMySQLでは書き方が違うので多少戸惑った点があったのですが、慣れてしまえば大丈夫でした。間違い等ありましたらご指摘して頂けると幸いです。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?