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

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

ただいまの
回答率

89.20%

XserverでMySQLが使えない。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 718

mito.2357

score 19

前提・実現したいこと

Web上でMySQlを動作させたいです。
SQliteを使った場合は正常に動作しましたが、MySQLに変えるとクエリの無いページのみ閲覧できる状態になりました。テーブルが存在していないからだろうと思いテーブルを作成する関数を呼び出すと、トップページの時点で下記のようなエラーが発生しました。
ローカル環境ではMySQLでも正常に動作しました。

発生している問題・エラーメッセージ

Internal Server Error 500

常に発生する場合:
CGIのパーミッション設定に誤りがある。 / CGIのソースコードに問題がある。/ .htaccess の記述に誤りがある。


以下追記

Traceback (most recent call last):
File:  "/home/mydomain/mydomain.com/public_html/test/do_create.py", line 4, in init_db()
File:  "/home/mydomain/mydomain.com/public_html/test/database.py", line 21, in init_db Base.metadata.create_all(engine)
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/sql/schema.py", line 4287, in create_all ddl.SchemaGenerator, self, checkfirst=checkfirst, tables=tables
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 2032, in _run_visitor with self._optional_conn_ctx_manager(connection) as conn:
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/contextlib.py", line 112, in __enter__ return next(self.gen)
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 2024, in _optional_conn_ctx_manager with self._contextual_connect() as conn:
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 2226, in _contextual_connect self._wrap_pool_connect(self.pool.connect, None),
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 2262, in _wrap_pool_connect return fn()
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 363, in connect return _ConnectionFairy._checkout(self)
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 760, in _checkout fairy = _ConnectionRecord.checkout(pool)
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 492, in checkout rec = pool._do_get()
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/pool/impl.py", line 139, in _do_get self._dec_overflow()
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__ compat.reraise(exc_type, exc_value, exc_tb)
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 154, in reraise raise value
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/pool/impl.py", line 136, in _do_get return self._create_connection()
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 308, in _create_connection return _ConnectionRecord(self)
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 437, in __init__ self.__connect(first_connect_check=True)
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 639, in __connect connection = pool._invoke_creator(self)
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect return dialect.connect(*cargs, **cparams)
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 451, in connect return self.dbapi.connect(*cargs, **cparams)
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/pymysql/__init__.py", line 94, in Connect return Connection(*args, **kwargs)
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/pymysql/connections.py", line 253, in __init__ self.ctx = self._create_ssl_ctx(ssl)
File:  "/home/mydomain/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/pymysql/connections.py", line 330, in _create_ssl_ctx ca = sslp.get('ca') AttributeError: 'str' object has no attribute 'get'


※File毎に改行しました。

該当のソースコード

init_db関数を実行すると上記のエラーが発生します。

# database.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

host = ホスト名
database = データベース名
user = ユーザー名
password =パスワード

engine = create_engine(f'mysql+pymysql://{user}:{password}@{host}/{database}?charset=utf8', convert_unicode=True)

Session = sessionmaker(autocommit=False, autoflush=False, bind=engine)
s = Session()

Base = declarative_base()

def init_db():
    import models
    Base.metadata.create_all(engine)
# do_create.py
from database import init_db

try:
    init_db()
except Exception as e:
    import traceback
    print(traceback.format_exc())

補足

Anacondaを使ってpythonファイルを実行しています。
mysqlClientはAnacondaからインストールしました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

もう少し情報がないとコメントしづらい感じがありますね。

ピンポイントで思うこととしては、

  • init_db() があるときはエラーになり、無いときはエラーにならないのか?
  • init_db() で500エラーになるというならば、例外がthrowされていると思われるがその例外は何か?

ですかね。
そのコードの問題ではなく、その外側の環境の問題である可能性も高いので、その辺の情報を整理して書いておくとアドバイスも受けやすいでしょう。

私が気になる順としては、

  • WebサーバやApplicationサーバのエラーログには、どういうメッセージが出ているのか
  • WebサーバとMySQLは同一ホスト上で実行されているのか、否か。そのとき host = ホスト名 は実際になんて書いたのか? MySQLはその接続を許可しているのか。

という感じです。


■ 追記1(コメント受けて)

そのエラーは有名な?やつですね。

End of script output before headers などでぐぐると結構出てくると思います。
※ エラーログのコアっぽい文字列でググるのはとても大事なことです。

例えば以下のような話です。
https://qiita.com/taro373/items/1a94c6cd8960f6d02509

蛇足感がありますが、少し説明しますと、

  • 「CGI」というのは、「Header」というのを「Body」の前に出力しないとダメなInterfaceである
  • 特に Content-Type Headerは省略できない
  • HeaderとBody は 1つの空行で区切る。だから print "Content-type:text/html\n\n" みたいなのを最初に書けって話になったりする。
  • Headerを出力しているが、それより前にBodyが出力されるとエラーになる(これはPHPでよく見かけるミス)

という感じです。
CGIなので何か出力していると思いますが、
そのエラーメッセージをみるにHeaderをBodyより前に出力しているかをまず確認したほうが良さそうです。


■ 追記2

更にコメントなんですが、

・init_dbの定義段階ではエラーせず、呼び出したときにエラーになります。

これは、そのCGIを呼び出した時に、 init_db() とその後の一連の処理がなければ正常に応答するってことですかね。
であれば、 Headerはちゃんと出力されているんだと思いますが、
init_db() を実行したときに、その中の何かが標準出力に文字列を吐き出してしまっていないでしょうか。

init_db() を呼ぶ前に 必要な Header をとりあえず出力してみたら、何か変わらないでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/15 18:14

    なるほど...

    https://stackoverflow.com/questions/48742736/using-ssl-with-sqlalchemy
    こういうQAがありました。
    接続文字列を

    f'mysql+pymysql://{user}:{password}@{host}/{database}?charset=utf8&ssl=true'

    としたらどうなりますでしょうか?

    キャンセル

  • 2019/08/15 22:26 編集

    ありがとうございます!
    調べて試してるうちに、&ssl=trueが入ってしまっていて&ssl=trueを消したらテーブル作成は無事に出来ました! 無事解決したので締めさせていただきます。私の知識が拙く時間がかかってしまいましたが最後まで付き合っていただき本当にありがとうございました!

    キャンセル

  • 2019/08/15 22:33

    そうですか。良かったです!

    キャンセル

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

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる