質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

5942閲覧

Python3でMySQLに接続しようとしたときに出るエラー"Host is not allowed to connect to this MySQL server"の対処法

Abeginner

総合スコア29

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/03/25 17:56

編集2020/03/26 08:21

初めてPython3でMySQLを使おうとしている初心者です。
プログラミング以前に基礎知識が足りていないかもしれませんがご容赦ください。

前提として、自分のPC(Windows10)のCドライブにPython3とMySQLをインストールし、パスも設定してあります。
関係あるかわかりませんが、エディタはVisual Studio Codeです。

本題に入ります。
現在、Python3を用いて、以下のようなコードでMySQLを試してみようとしたのですが、

Python3

1#!/usr/bin/python 2#! coding: utf-8 3 4import datetime 5import MySQLdb 6 7# 現在の日付を取得 8now = datetime.datetime.now() 9 10# データベース接続とカーソル生成 11connection_to_tests = MySQLdb.connect(user='root', passwd='****', host='****', db='tests') 12cursor_tests = connection_to_tests.cursor(MySQLdb.cursors.DictCursor) 13table_name = 'test' 14cursor_tests.execute("CREATE TABLE IF NOT EXISTS %s (date DATE, number INTEGER, string VARCHAR(4);" %table_name) 15 16# データ登録 17sql = "INSERT INTO %s VALUES(%s, %d, %s);" 18cursor_tests.execute = (sql, (table_name, now.date, 1234, 'test')) 19 20# データ検索 21cursor_tests.execute = ("SELECT * FROM %s WHERE (DATE_FORMAT(date, '%m') = %s);" %(table_name, now.month)) 22 23print(cursor_tests.fetchall())

その結果、

ErrorMessage

1MySQLdb._exceptions.OperationalError:(1130, "Host '****' is not allowed to connect to this MySQL server")

というエラーが出てしまいます。

python3もMySQLもpyファイルも全て同じCドライブに入っているのに、pythonでMySQLへの接続が許されないものなのでしょうか?
Google検索はしてみたものの調べ方の問題か、知識不足で説明を理解できていないのか、対処法がわかりません。
どのような設定や対処をすれば、pythonを使ってMySQLを使えるようになるか教えて下さい。

もし、コードの方の問題だとしたら、それも正して頂けると助かります。

【追記】

mysqlは実行されているのか

タスクマネージャーで見ると、mysqld.exeが動いていますが、実行されていることになりますか?

他のクライアントからの接続確認

自分のPCにMySQLを入れて一人で練習しようとしているだけなので、他の端末からは試していません。コマンドプロンプトからであれば「mysql -u root -p」で接続し操作できました。

【追記2】

mysql -u root -p**** -h **** tests

これをコマンドプロンプトでやってみた結果、

mysql Ver 8.0.19 for Win64 on......

から始まる非常に長いメッセージが返ってきました。

しかし、ついでに

>mysql -u root -p**** -h ****

これも試してみたのですが、
ERROR 2005 (HY000): Unknown MySQL server host **** (0)
というエラーが出て実行できませんでした。

自分がホスト名を間違えているのかと思い、

mysql> show variables like 'hostname';

で確認したのですが、ホスト名は正しいようです。

逆に、pythonのコードの方からホスト名を消して

connection_to_tests = MySQLdb.connect(user='root', passwd='****')

としてみたところ、当初の質問の
MySQLdb._exceptions.OperationalError:(1130, "Host '****' is not allowed to connect to this MySQL server")
というエラーが出なくなりました。

現在、この使い方が正しいのか判断がつかなくて止まっているのですが、pythonで同じPC内に入っているMySQLを使うときには、ホスト名は指定しなくて大丈夫なものなのでしょうか?
逆に、ホスト名を指定した時だけエラーになるのは、どういうことなのでしょうか?

質問ばかりで申し訳ありませんが、何卒ご教示頂けると幸いです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2020/03/25 23:07

mysqlは実行されているのか、他のクライアントからの接続確認は済んでいるのか、それはどうやったか何を確認したか、あたりの情報があるとよいかと思います。
退会済みユーザー

退会済みユーザー

2020/03/26 00:01

あなたのそのマシンからの接続が許可されていないだけでは
t_obara

2020/03/26 00:41

`is not allowed to connect to this MySQL server`でググってみて色々と試してみると良いと思います。
Abeginner

2020/03/26 00:52

> quiquiさん ご指摘ありがとうございます。 質問中にも追記しましたが、これで情報は足りますでしょうか? >mysqlは実行されているのか タスクマネージャーで見ると、mysqld.exeが動いていますが、実行されていることになりますか? >他のクライアントからの接続確認 自分のPCにMySQLを入れて一人で練習しようとしているだけなので、他の端末からは試していません。コマンドプロンプトからであれば「mysql -u root -p」で接続し操作できました。 > asahina1979さん > あなたのそのマシンからの接続が許可されていないだけでは それはそうなのだと思いますが、自分のPCの中に全て入っていてネットワークを介していなくてもダメなのですね? どうしたら自分のPCのCドライブから自分のPCのCドライブへの接続が許可されますか? > t_obaraさん 調べてはみたのですが、恐らく私の知識力理解力不足のせいで、説明が理解できず… 自分のPCのCドライブから自分のPCのCドライブへの接続をするときに、ファイアウォールって関係あるのですか?この場合、自分のPCはローカルホストに当たるのですか?自分のPCをローカルホストとして接続を許可する必要があるとしたら、どうすれば良いのでしょうか? 質問ばかりで申し訳ございませんが、何か手掛かりだけでも頂けたらと思います。
yukky1201

2020/03/26 02:45

pythonのコードで接続するときと同じ条件となる下記でコマンド接続はできますか mysql -u root -p**** -h **** tests パスワードとホストはコードで指定している(伏字の部分)のと同じ文字列で実行してください ※-pのあとに空白は入れないこと!
退会済みユーザー

退会済みユーザー

2020/03/26 03:17

コマンドプロンプト(ソケット通信)とパイソン(TCP通信:ネットワーク経由)なのですよ。 ソケット通信のみ許可してるとかループバックドメインが解決できないとかいろいろありそう
Abeginner

2020/03/26 08:13

> yukky1201さん アドバイスありがとうございます。 > mysql -u root -p**** -h **** tests これをコマンドプロンプトでやってみた結果、 mysql Ver 8.0.19 for Win64 on...... から始まる非常に長いメッセージが返ってきました。 しかし、ついでに > mysql -u root -p**** -h **** これも試してみたのですが、 ERROR 2005 (HY000): Unknown MySQL server host **** (0) というエラーが出て実行できませんでした。 自分がホスト名を間違えているのかと思い、 mysql> show variables like 'hostname'; で確認したのですが、ホスト名は正しいようです。 逆に、pythonのコードの方からホスト名を消して connection_to_tests = MySQLdb.connect(user='root', passwd='****') としてみたところ、 MySQLdb._exceptions.OperationalError:(1130, "Host '****' is not allowed to connect to this MySQL server") というエラーが出なくなりました。 エラーが出なければ結果オーライな気もしますが、何が起きたのか理解できず、先に進んでよいものかわかりません。 ホスト名は指定しなくて大丈夫なものなのでしょうか? > asahina1979さん > コマンドプロンプト(ソケット通信)とパイソン(TCP通信:ネットワーク経由)なのですよ。 初めて知りました…勉強になります。 TCPはちょっとわからなかったですが、ソケットは(No default value)となっていました。
yukky1201

2020/03/26 08:29

>非常に長いメッセージが返ってきました。 そこに私が知りたい情報があります。きっと。
Abeginner

2020/03/26 08:37

> yukky1201さん Usageは省きましたが、これで良いでしょうか? ---------------------------------------------------- MySQL\MySQL Server 8.0\my.cnf The following groups are read: mysql client The following options may be given as the first argument: --print-defaults Print the program argument list and exit. --no-defaults Don't read default options from any option file, except for login file. --defaults-file=# Only read default options from the given file #. --defaults-extra-file=# Read this file after the global files are read. --defaults-group-suffix=# Also read groups with concat(group, suffix) --login-path=# Read this path from the login file. Variables (--variable-name=value) and boolean options {FALSE|TRUE} Value (after reading options) --------------------------------- ---------------------------------------- auto-rehash TRUE auto-vertical-output FALSE bind-address (No default value) binary-as-hex FALSE character-sets-dir (No default value) column-type-info FALSE comments FALSE compress FALSE database (No default value) default-character-set auto delimiter ; enable-cleartext-plugin FALSE vertical FALSE force FALSE histignore (No default value) named-commands FALSE ignore-spaces FALSE init-command (No default value) local-infile FALSE no-beep FALSE host 'ホスト名' html FALSE xml FALSE line-numbers TRUE unbuffered FALSE column-names TRUE sigint-ignore FALSE port 0 prompt mysql> quick FALSE raw FALSE reconnect TRUE shared-memory-base-name (No default value) socket (No default value) server-public-key-path (No default value) get-server-public-key FALSE ssl-ca (No default value) ssl-capath (No default value) ssl-cert (No default value) ssl-cipher (No default value) ssl-key (No default value) ssl-crl (No default value) ssl-crlpath (No default value) tls-version (No default value) tls-ciphersuites (No default value) table FALSE user root safe-updates FALSE i-am-a-dummy FALSE connect-timeout 0 max-allowed-packet 16777216 net-buffer-length 16384 select-limit 1000 max-join-size 1000000 show-warnings FALSE plugin-dir (No default value) default-auth (No default value) binary-mode FALSE connect-expired-password FALSE compression-algorithms (No default value) zstd-compression-level 3
guest

回答2

0

ベストアンサー

connection_to_tests = MySQLdb.connect(user='root', passwd='****', host='****', db='tests')

で、伏せてますけど、host='localhost'ではないのですか?

SELECT user,host FROM mysql.user; | user | host | +------------------+-----------+ | root | localhost |

上記ですので、これがマッチしないと違うアカウントと認識されて接続失敗している可能性があります。

pythonのコードの方からホスト名を消して

ホストを指定しないとデフォルトのlocalhostに接続しますので、結果的にrootアカウントで、localhostに接続しに行ってます。

投稿2020/03/26 08:29

yukky1201

総合スコア2751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Abeginner

2020/03/26 09:06

> 伏せてますけど、host='localhost'ではないのですか? いえ、 mysql> show variables like 'hostname'; で出てきた +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | hostname | 'ホスト名' | +---------------+-----------------+ この'ホスト名'を入れていました。 仰る通り、 host='localhost' にすると、ホスト名を消した場合と同じ結果となりました。 その結果、こんなメッセージ MySQLdb._exceptions.ProgrammingError: (1064, "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 '' at line 1") が出てくるのですが、これはたぶん別の問題ですよね? 結果として、pythonから自分のPCのMySQLに接続する場合は、 host='localhost' とすれば良いのでしょうか? コマンドプロンプトで、 mysql -u root -p**** -h 'localhost' とすると、 ERROR 2005 (HY000): Unknown MySQL server host ''localhost'' (0) と出てしまうのですが、これはなぜでしょう?
yukky1201

2020/03/26 09:56

mysql -u root -p**** -h localhost で実行してください。(「'」が不要) このあたりのコマンドについては、公式マニュアルを見るくせをつけた方が良いです(正確な情報を得られます)
Abeginner

2020/03/26 13:03

ありがとうございます。 できました!
guest

0

そのHOSTとユーザーにGRANT権限はありそうですか?
https://qiita.com/PallCreaker/items/0b02c5f42be5d1a14adb

投稿2020/03/26 01:21

mongolia

総合スコア133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Abeginner

2020/03/26 01:58

情報ありがとうございます。 とりあえずコマンドプロンプトで SELECT user,host FROM mysql.user; というコマンドを試した結果、 +------------------+-----------+ | user | host | +------------------+-----------+ | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +------------------+-----------+ という結果が得られました。 続いて、 SHOW GRANTS FOR root@'localhost'; を実行しましたが、とりあえず目ぼしい権限は全て付与されているように見えます。 自分のPCのpythonを用いて自分のPCのMySQLに接続しようとしているとき、自分はrootからrootに接続しようとしているのだと思っているのですが、合ってますか? たぶんGRANT権限はあるのだと思います。
mongolia

2020/03/26 02:20

むむむっ、pythonで接続しているHOSTが、127.0.0.1ではなくlocalhostということなら、GRANT権限はありそうですね。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問