LoginSignup

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pythonでmysqlに接続する際にローカルのDBには接続ができるがリモートのDBに接続できない

解決したいこと

xサーバーにflaskで作成したHPをデプロイしている途中なのですが、
xサーバーのリモートDBにローカル環境から試験的に接続しようすると下記エラーが発生してしまいます。

.エラー
AttributeError: 'NoneType' object has no attribute 'cursor'

発生している問題・エラー

.ライブラリ情報
import datetime

from flask import Flask, render_template, request, redirect, url_for
import mysql.connector
from mysql.connector import Error
from dotenv import load_dotenv
load_dotenv()
import os
.DB接続メソッド
"""
*DB接続用メソッド
*引数(ホスト名、ユーザー名、パスワード、DB名)
*接続を返す
"""
def server_connection(HOST_NAME, USER_NAME, USER_PASSWORD, DATABASE_NAME):
    connection = None
    try:
        connection = mysql.connector.connect(
            host=HOST_NAME,
            user=USER_NAME,
            passwd=USER_PASSWORD,
            database=DATABASE_NAME
        )
    except Error as e:
        with open('error_log.txt', 'a') as f:
                f.write("%s\n" % e)
    return connection
.全情報取得メソッド
"""
*全情報取得用メソッド
*引数(DB名)
*全情報を返却
"""
def select_schedule(DATABASE_NAME, item_name):
    conn = server_connection(HOST_NAME, USER_NAME, USER_PASSWORD, DATABASE_NAME)
    cursor = conn.cursor()
    try:
        cursor.execute('SELECT * FROM schedule_master WHERE ItemName=%s ', (item_name,))
        items = cursor.fetchall()
        cursor.close()
        conn.close()
    except Error as e:
        with open('error_log.txt', 'a') as f:
            f.write("%s\n" % e)
    return items
.ローカルDB
HOST_NAME='localhost'
USER_NAME='root'
USER_PASSWORD='DRmg'
.リモートDB(IPアドレス)
HOST_NAME='■■■.■■.■■.■■'
USER_NAME='■■■■■■■■■■■_■■■■'
USER_PASSWORD='■■■■■■■■■■■■'
.リモート(ホスト名)
HOST_NAME = '■■■■■■■.■■■■■■■.jp'
USER_NAME = '■■■■■■■■■■■_■■■■'
USER_PASSWORD = '■■■■■■■■■■■■'
.エラー
AttributeError: 'NoneType' object has no attribute 'cursor'

ローカルDBの際は問題なく接続することができるのですが、
リモートに接続すると接続情報に誤りはないはずなのですが、接続するエラーが出てしまいます。
ホスト名で試してダメだったので、IPアドレスで試したのですが、そちらでも同様のエラーが発生してしまいました。

.cmdでのログイン
$ mysql -u ■■■■■■■■■■■_■■■■ -p
Enter password:■■■■■■■■■■■■

cmdでログインを行えるのでUSER_NAMEとUSER_PASSWORDは間違っていないと考えています。
IPアドレスとホスト名に関しては以下手順で確認を行いました。

.確認手順
xサーバーのサーバーパネルにログイン
↓
アカウント>サーバー情報
↓
ホスト名:■■■■■■■.■■■■■■■.jp
IPアドレス:■■■.■■.■■.■■

自分の認識ではコードの書き方に問題はないと思うのですが、接続が行えないということで詰まってしまっています。
接続できない理由等をご存じの方がいらっしゃいましたら教えていただけますと幸いです。
最後まで読んでいただきありがとうございます。
何卒よろしくお願いいたします。

0

3Answer

「ローカルDB」と「リモートに接続するDB」は同じインスタンス(同じDBサーバ)でしょうか?

ローカル端末からDBサーバに、ping は通りますか?

connectでエラーになっているではと想定しますが、それに関するエラーメッセージは出ていないでしょうか?
DB接続メソッド で出力しているerror_log.txtには、何が出ているのでしょうか?

当然、サーバー側で、mysqlのリモートアクセスを許可していますね。
また、mysqlのlistenポートはデフォルトのままでしょうか?

0

Comments

  1. @Kobayashi0620

    Questioner

    ご回答ありがとうございます
    error_log.txtには以下の内容が出力されていました。
    2003 (HY000): Can't connect to MySQL server on '■■■■■■■.■■■■■■■.jp:3306' (10060)
    >「ローカルDB」と「リモートに接続するDB」は同じインスタンス(同じDBサーバ)でしょうか?
    >ローカル端末からDBサーバに、ping は通りますか?
    >mysqlのlistenポートはデフォルトのままでしょうか?
    すみません。自分の知識不足でこちらのお話の内容については理解が出来ませんでした。

    >サーバー側で、mysqlのリモートアクセスを許可していますね。
    mysqlのリモートアクセスの許可というものがあったのですね、、
    そちらの問題かもしれません。
    ですが、そちらの行い方が自分では初めて聞いたため、調べ方がよくわかりません。
    なにか参考になる記事等がありましたら教えていただけると幸いです。

そもそもWebフレームワークと連動するためのDBを単体で外部からアクセス(可能に)すること自体必要があるのか疑問があります.
どのような経緯でDBのみリモートに置く環境をテストする必要があったのか分かりませんが,少なくともFlaskがデプロイ先で動作するのを確認するのが先と考えます.
BFFという概念があるくらいなので,DB自体がリモートアクセスを保証する必要性については最初に(=設計段階で)検討してください.

0

Comments

  1. @Kobayashi0620

    Questioner

    回答いただきありがとうございます。
    flaskをxサーバーにアップロードしたのですが、500エラーが発生してしまい、その原因究明の方法がわからなかったため、MySQLでの接続障害でも500エラーが発生するといった記事を目にしたので、接続できるかどうかを確認した次第です。
    500エラーにはほかにも.cgiファイルや.htaccessの設定ミスによっても起きてしまうということも記載してあったのでそちらのかと思い確認した際には自分の浅い知識では、問題はなさそうだったため、ローカルでの確認を行いました。

    こういった際にはどういった手順で確認を行うのがベストでしょうか?

  2. エラーが発生した際は検索結果のページをデタラメに試す前に必ずログを取りましょう.
    実際の稼働環境で何が起こっているのか確認してください.

xサーバーのリモートDBにローカル環境から試験的に接続

そもそもそういうことは許されてないのでは? X サーバーのサポートに確認しましたか?

0

Your answer might help someone💌