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では書き方が違うので多少戸惑った点があったのですが、慣れてしまえば大丈夫でした。間違い等ありましたらご指摘して頂けると幸いです。