Python MySQL テーブルが作成できない

Python学習【365日チャレンジ!】142日目のマスターU(@Udemy11)です。

物欲ってほんと恐ろしいです。

大きい魚を狙うショアジギングからアジングなどのライトゲームまで、道具は一式そろえてあるので、あまり欲しいものがなかったのですが、一つだけ不満に感じていたものがありました。

ランディングネット(タモ)は、実家にあった安ものを使っているので、かさばるうえ、重たいんです。

何気なしに、ネットサーフィンをしていると、表示されるアドセンスの広告に、おしゃれなランディングネットが表示されているではありませんか!

もうそれからは、Amazonや楽天市場で商品を検索しまくって、時間も浪費しまくってるんですよね。

ほんと物欲は良くないですね。

ということで、今日もPython学習をはじめましょう!

昨日の復習

MacにMySQLをインストールするところから、MySQLのユーザーとパスワードを作成し、データベースに関する権限を与えるところまでと、作成したユーザーでMySQLにログインして、テーブルを作成してフィールドを追加するところまでを2日間で学習しました。

2日目のテーブル作成で、頭から湯気が出るくらいハマってしまったところがあるので、健忘録的に記録しておきたいと思います。

昨日、一昨日で学習した内容はこちらの記事をごらんください。

MySQLのバージョンの違い?

ハマったのは、次のテーブル作成のCREATE TABLEのSQL文のコードです。

cursor.execute('CREATE TABLE persons('
               'id int NOT NULL AUTO_INCREMENT,'
               'name varchar(14) NOT NULL,'
               'PRIMARY KEY(id))')

すでに何度か紹介していますが、現在私は、酒井さんの【現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー一流コードスタイル】講座を受講しながらPython学習365日チャレンジを実践しています。

Udemy講師 酒井さん プログラミング Python

たまに、この講座のレクチャーと同じように実行してもうまく動作しないことがあるのですが、それは、PythonにしてもMySQLにしてもどんどんアップデートしているからです。

このレクチャーが作成されたときに、MySQLのバージョンは、5.7あたりだったのかもしれませんが、現在のバージョンは、8.0.19です(2020年7月1日現在)。

Pythonも2と3では微妙にコードが違うところがあるので、バージョンの違いでコードスタイルが微妙に違うのかと思って、ネットを調べたりして試してみました。

今日は、その試してみたことを紹介していこうと思います。

シングルクォーテーションで括る

PythonでMySQLのテーブルを作成」でググってみたところ、テーブルを作成するには、テーブルやフィールドをシングルクォーテーションで括っているものが見かけられたので、次のようにコードを書いてみました。

cursor.execute("CREATE TABLE 'persons'("
               "'id' int NOT NULL AUTO_INCREMENT,"
               "'name' varchar(14) NOT NULL,"
               "PRIMARY KEY(id))")

もちろんうまくいかず、返されるエラーには次のような記述がありました。

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''persons 'id' int NOT NULL AUTO_INCREMENT, 'name' varchar(14) NOT NUL' at line 1

SQL構文のエラーで、インストールしたMySQLのバージョンのマニュアルを見ろという感じだと思ったので、MySQLの英語のページからGoogle翻訳も活用しつつ調べてみるも、原因がよくわかりません。

トリプルクォーテーションで記述

次に試したのが、SQL文をトリプルウォーテーション("""で囲んで記述する方法です。

cursor.execute(
               """
               CREATE TABLE 'persons'(
               'id' int NOT NULL AUTO_INCREMENT,
               'name' varchar(14) NOT NULL,
               PRIMARY KEY(id))
               """
               )

やはりこれでもうまくいかないんです。

IF NOT EXITSを追加

次にこちらの記事を発見して、ここでよくよくコードを見てみると、IF NOT EXISTSが入っていることに気づき、追加してみることに。

追加したコードがこちら。

cursor.execute(
               """
               CREATE TABLE IF NOT EXISTS 'persons'(
               'id' int NOT NULL AUTO_INCREMENT,
               'name' varchar(14) NOT NULL,
               PRIMARY KEY(id))
               """
               )

これでうまくいくかと思ったのですが、やっぱりエラー

それなら最初に戻って、レクチャーにあったコードでIF NOT EXISTSだけ追加して、フィールド名のシングルクォーテーションを外して実行してみたところ、うまくテーブルを作成することができました。

cursor.execute('CREATE TABLE IF NOT EXISTS persons('
               'id int NOT NULL AUTO_INCREMENT,'
               'name varchar(14) NOT NULL,'
               'PRIMARY KEY(id))')

「なんだ、原因はIF NOT EXISTSがなかったからか」ということでめでたく解決!だと思ったのですが、どうもそれが原因じゃないような感じが。。。

最初のコードを試してみる

うまくテーブルが作成できたので、レコードの追加などの処理をしたあと、再度、酒井さんのレクチャーで紹介されているコードでテーブルが作成できないのか試してみたくなり、改めてレクチャーでのコードをテーブル名を変更して試してみることに。

cursor.execute('CREATE TABLE test_table('
               'id int NOT NULL AUTO_INCREMENT,'
               'name varchar(14) NOT NULL,'
               'PRIMARY KEY(id))')

そしたらなんとビックリなことに、エラーが起こらずにテーブル(test_table)を作成することができたんです。

原因は一体なに?

結局、原因が一体なんだったのかわからないんです。

タイプミスだったんじゃないの?

という声が聞こえてきそうですが、何度もコードを見直して何度も実行したので、タイプミスではないと思いますが、このコード以外の部分を変更したりもしたので、その部分が間違っていたのかもしれません。

もし記事を読まれて「原因はこれじゃない?」という心当たりがある方がいらっしゃれば、【お問合わせ】から教えていただけると幸いです。

といいつつ、私が間違えていたことが一つありました。

バッククォーテーション

ネットで調べて見つけたQitaの【Python+mysql-connect-pyhonの使い方】の記事で、シングルクォーテーション(')だと思っていたのが、実はバッククォーテーション(`)だったということです。

老眼が入ってきている私には、ほんと見分けがつかないのですが、全く違う文字なので、紹介されている記事のように、バッククォーテーション(`)を使って試してみました。

cursor.execute(
    """
    CREATE TABLE `persons_test`(
    `id` int NOT NULL AUTO_INCREMENT,
    `name` varchar(14) NOT NULL,
    PRIMARY KEY(id))
    """
)

すると、ビックリなことに、このコードでもテーブルを作成することができたんです。

まー、当たり前といえば当たり前なんですが、いろいろと試してできなかったことができると、感動も大きくなります。

つまづくと憶える

苦労して理解できたことってかなり強烈に記憶に残っています。

なので、昨日つまづいたMySQLのテーブルの作成については、私の記憶に深く刻まれているはずです。

とはいえ、復習しないことにはその記憶が定着することはないので、こうして健忘録の記録として残しておきました。

結局、うまくいかなかった原因はわからずじまいですが、ハマったことで、ターミナルからのテーブル作成や削除、データベースの削除や参照などいろいろなSQL文に触れることができたので、ハマって時間を費やすことも無駄ではないと感じています。

これが誰かの役に立つかどうかはわかりませんが、もし私のようにハマっている人の問題解決のヒントになれば幸いです。

それでは、明日もGood Python!