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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1696閲覧

XserverでMySQLが使えない。

mito.2357

総合スコア19

MySQL

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/08/06 07:59

編集2019/08/13 15:25

前提・実現したいこと

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関数を実行すると上記のエラーが発生します。

python

1# database.py 2from sqlalchemy import create_engine 3from sqlalchemy.ext.declarative import declarative_base 4from sqlalchemy.orm import sessionmaker 5 6host = ホスト名 7database = データベース名 8user = ユーザー名 9password =パスワード 10 11engine = create_engine(f'mysql+pymysql://{user}:{password}@{host}/{database}?charset=utf8', convert_unicode=True) 12 13Session = sessionmaker(autocommit=False, autoflush=False, bind=engine) 14s = Session() 15 16Base = declarative_base() 17 18def init_db(): 19 import models 20 Base.metadata.create_all(engine)

python

1# do_create.py 2from database import init_db 3 4try: 5 init_db() 6except Exception as e: 7 import traceback 8 print(traceback.format_exc()) 9

補足

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

  • 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/07 12:18

編集2019/08/08 07:55
mokemokechicken

総合スコア948

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

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

mito.2357

2019/08/08 07:36

回答、ありがとうございます。 出来る限りの情報は記載したつもりだったのでしたが情報不足ですみません。 ・init_dbの定義段階ではエラーせず、呼び出したときにエラーになります。 ローカル環境ではエラーにならないので外部環境の問題かと思います。エラーログは以下のようになりました。 ``` [cgid:error] End of script output before headers: index.cgi ``` 最後の質問については、知識不足なのと確認方法が分からないので解答できません。
mito.2357

2019/08/08 07:44

↑webサーバのエラーログです。 ローカルではエラーしなかったのでスクリプトがthrowしたエラーは確認できませんでした。
mito.2357

2019/08/08 08:27 編集

迅速な回答ありがとうございます!
mokemokechicken

2019/08/08 07:56

追記2を追加しました。どうですかね...?
mito.2357

2019/08/08 08:13

追記、ありがとうございます! すみません。CGIの知識が足りなくてHeaderやBodyについて調べてから試してみます。
mokemokechicken

2019/08/08 08:33

余計かもしれませんが、CGIが不慣れなのであれば、 https://buki.tech/python-cgi/ などのように、まずは Hello World から始めるのが良いかもしれません。 最初の行の `#!/usr/bin/python` も無いとたぶん動かないですし。 ※ そこはクリアされてますかね...?
mito.2357

2019/08/08 08:55

最初の行はクリアしています。 `#!/home/~~/.pyenv/versions/anaconda3-5.3.1/bin/python` flaskというフレームワークを使っているのですが、やはりCGIもしっかり理解しないとだめなのでしょうか?
mokemokechicken

2019/08/08 09:07 編集

flaskなんですね。 - Flaskであれば、CGIではなく単体でWeb Server&Applicationとして動かせるので、まずはそのシンプルなモードで起動してはどうでしょうか - CGIは「もはや使われない技術(リクエスト毎にプロセス起動するので非効率)」なので特に覚える必要はないです - Pythonであれば CGIではなくWSGI というのが主流で、 Flask単体ではなく、ApacheやNginxと連携する場合ではこちらを使うのが推奨されます という感じなので、まずは 「Flask単体起動」のHello Worldから始めて、次にMySQLからデータを取り出して表示する、などの順に進めてみてはどうでしょうか。 ある程度大きなサービスとして、本番環境にDeployしようとする場合に WSGIなどを学べば良いと思います。
mokemokechicken

2019/08/08 09:19

今更ですみませんが XServer というレンタルサーバー上の話なんですね。認識していませんでした... これをみる限りここでPythonアプリケーションを動かすならCGI を使うしか選択肢はなさそうですね... となると、試す順番としては - 1) Python CGIで Hello World を表示する - 2) init_db() を読んだあと 相変わらず Hello Worldを表示する - 3) 2 の後、DBに "SELECT 1" みたいなクエリをかけて、 Hello Worldを... - 4) 本当にDBにデータを問い合わせて表示させてみる という順番に試してみると良い気がします。
mito.2357

2019/08/08 09:27

詳しくありがとうございます! flaskといい、本文中にもXserver上の話と言っておくべきでしたね。本当にすみません。 試してみます。
mito.2357

2019/08/09 04:23

やはり2の段階でエラーしてしまいました...。
mokemokechicken

2019/08/09 05:23

なるほど。。 例えば、 ``` print("Content-Type: text/html\n\n") try: init_db() except Exception as e: print(repr(e)) print("Hello World") ``` とかで、何かエラーが補足できないでしょうか?
mito.2357

2019/08/09 06:36 編集

ありがとうございます! エラーが表示されました。 `OperationalError('(_mysql_exceptions.OperationalError) (2006, "Host \'Myホスト\' is not allowed to connect to this MariaDB server")')` '(_ mysql_exceptions.OperationalError)(2006、 "ホスト\' Myホスト 'はこのMariaDBサーバーへの接続を許可されていません")' サーバへ接続が許可されていないということは、何か設定が足りないということでしょうか? 追記 MySQLの権限設定が足りてないという趣旨のサイトがありました。 http://yosugi.hatenablog.jp/entry/2013/06/23/185240
mokemokechicken

2019/08/09 06:46

そうですね。 MySQL側で、アクセス元に応じて接続を制御する仕組みがあります。MariaDBでもたぶん同じです。 そこで 「MySQL側からみたWebサーバのIP」を許可するようにする必要がありますね。
mito.2357

2019/08/10 07:43

今度は `(_mysql_exceptions.OperationalError) (2006, 'SSL connection error: SSL_CTX_set_tmp_dh failed')` というエラーを吐いてしまいました。数時間調べましたがよくわかりませんでした。 ssl_keyのようなものは受け取っていません。
mito.2357

2019/08/13 07:19

日が随分開いてしまいすみません。 Driverはmysqlclientを使っていました。 pymysqlにするとthrowするエラーがAttributeError("'str' object has no attribute 'get'")に変わったので、ようやく解決したと思い調べてみましたが、結局どこでエラーを吐いているのか分かりませんでした。
mokemokechicken

2019/08/13 07:59

なんか普通のエラー?になりましたね。 エラーのStack Trace全体とコードを見せてもらえば、アドバイスできることもあるかもしれないです。
mito.2357

2019/08/13 14:48

ありがとうございます。追記しました。 恥ずかしながらTracebackを文字列として取得できることを初めて知りました。 コードに関してはTracebackで呼び出されているファイルのみ追記しました。
mito.2357

2019/08/13 15:24

非常に申し訳ないのですが、data base.pyの追記を忘れていました。 ドライバをpymysqlにした際に、 mysql+pymysqlに変えていました。 なので上のTrancebackは mysql+pymysqlの状態で発生しています。
mokemokechicken

2019/08/13 22:22

なるほど。よく見ると接続自体は成功しているんですよね。 sqlalchemy側の問題のような気もしてくるなぁ。 これは今でも、Local環境だとちゃんと動いて、Xserverだとエラーになるのでしょうか?
mito.2357

2019/08/15 05:27

はい、local環境だと動作しています。sslの問題とかなのでしょうか?
mito.2357

2019/08/15 13:29 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問