kuroの覚え書き

96の個人的覚え書き

flaskr 再び

MySQL移植が途中になっていたFlaskrの方もMySQLで動くようにしてみよう。

まずはやはりデータベースをちゃんと作ってやらないとだめってこと。というかそれさえちゃんとやればほとんど問題なく動く。

mysql> USE flaskr
mysql> show variables like 'char%';
+--------------------------+-----------------------------------------------------------+
| Variable_name            | Value                                                     |
+--------------------------+-----------------------------------------------------------+
| character_set_client     | utf8                                                      |
| character_set_connection | utf8                                                      |
| character_set_database   | latin1                                                    |
| character_set_filesystem | binary                                                    |
| character_set_results    | utf8                                                      |
| character_set_server     | utf8                                                      |
| character_set_system     | utf8                                                      |
| character_sets_dir       | /usr/local/mysql-5.7.19-macos10.12-x86_64/share/charsets/ |
+--------------------------+-----------------------------------------------------------+
8 rows in set (0.00 sec)
#またデータベースがlatin1になっているのでutf8に変更
mysql> alter database flaskr character set utf8;
Query OK, 1 row affected (0.00 sec)
mysql> create table entries (id int, title char(100), text TEXT(1000));
Query OK, 0 rows affected (0.04 sec)

この状態でアプリを走らせ書き込みを試してみたとこと書き込めて入るのに表示ができない。
スクリプトの方ではtitle = db.Column(db.Text)だったからchar(100)をtext(100)に変えてみてもやはりエラー。

mysql> alter table entries modify title TEXT(100);
Query OK, 2 rows affected (0.08 sec)
Records: 2  Duplicates: 0  Warnings: 0

idがPRIMARY KEYになっていないのがまずいのか?

mysql> alter table entries add primary key (id);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc entries;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
| title | text    | YES  |     | NULL    |       |
| text  | text    | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)

まだだめ。

mysql> show create table entries \G
*************************** 1. row ***************************
       Table: entries
Create Table: CREATE TABLE `entries` (
  `id` int(11) NOT NULL,
  `title` text,
  `text` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> alter table entries engine=MyISAM;
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0

エンジンを変えてみては?・・・やっぱりダメ。
Field id doesn’t have default valueというエラーが出ているのでネット検索
http://sawara.me/mysql/1239/

mysql> SHOW GLOBAL VARIABLES LIKE 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SET GLOBAL sql_mode=NO_ENGINE_SUBSTITUTION;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from entries;
+----+-------+-------+
| id | title | text  |
+----+-------+-------+
|  0 | test  | test1 |
+----+-------+-------+
1 row in set (0.00 sec)

対処してみたら書き込めた。と思ったら2つ目が入らない。
idが書き込む度に自動で増えていく必要があるのだね。

mysql> alter table entries drop id;
Query OK, 1 row affected (0.07 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> alter table entries add id int primary key AUTO_INCREMENT;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from entries;
+-------+-------+----+
| title | text  | id |
+-------+-------+----+
| test  | test1 |  1 |
+-------+-------+----+
1 row in set (0.00 sec)

ようやく完成。これでちゃんと書き込めるし、日本語でもきちんと表示される。MySQLへの移植はちゃんとできた。