47884
初めて質問させて頂きます。  
現在、私はpythonを独学で勉強しており、学習の一環でちょっとしたwebアプリ(非常に小規模でURLも2つくらいのものを想定)を開発しようと考えています。  
pythonの構文やwebフレームワーク(flask)は一通り勉強しました。

しかし、開発環境の構築のところでよくわからないところがあったので、その点を質問させて頂きます。

具体的な質問内容としては「仮想環境(pythonのvertualenv-
venvを想定)と仮想マシン(Vagrantを想定)の違いと開発環境の構築について」です。

私が調べた限りですと、pythonの仮想環境は、複数のアプリケーションを一つのサーバで走らせる時などにpythonのバージョンやそれぞれのパッケージ、モジュールなどが競合しないように、それぞれのアプリケーションに適したpython環境を構築するというイメージです。  
一方で、仮想マシンは自身のローカルPC上に実際のアプリケーションを走らせるサーバ環境を構築してしまうものというイメージを持っています。pythonの仮想環境よりもより基礎となる部分に関わっているものだと考えています。

その上でですが、webアプリを開発する場合、pythonの仮想環境を構築した上でコードを完成させ、その後仮想マシンを構築し、そこでテスト起動してみるというのが一般的な流れなのでしょうか。

今回、この疑問の契機となったのは、データベースの設計です。webアプリで利用するDBを今回MySQLにしようと考えているのですが、上記のような流れ(仮想環境下でコード構築->仮想マシン下でwebアプリのテスト起動)で開発する場合、ちょっとしたコードの確認をする上で(コードがしっかり動いてMySQLに保存されているか確認する程度のコードの小規模な実行を想定)、MySQLを自身のPCにそのままインストールする必要があるのかなと思います(vertualenvではpython関連は分離するもMySQLまでは分離されないのではないかと思っています)。しかし、今後他のwebアプリを開発する時などに何らかの支障がでることも考え、仮想環境や仮想マシンのような閉じられた環境下でインストールするのが良いのではないかというのが、そもそもの疑問の契機です。

冗長かつ一般論での質問となってしまいましたが、ご回答いただけますと幸いです。

どうぞよろしくお願いします。
CC BY-SA 4.0
2018-08-27T16:12:45.263
47863
2018-08-28T22:42:06.430
29884
question
python データベース設計
Pythonでのwebアプリの開発環境について
# TL; DR

Vagrantを使うのがよいと思います。virtualenvは使えると便利ですが、必ずしも必要という訳ではありません。

# 詳細

  * `vertualenvではpython関連は分離するもMySQLまでは分離されないのではないか`  
ご認識の通り、Pythonのパッケージなどをシステムデフォルトのものと分けて管理するために使われますが、MySQLその他Python外部の環境は分離できません。  
依存パッケージの切り分けなどに便利であり、Python開発におけるベストプラクティスのような所もありますので、とりあえず使っておくのがよろしいかと存じますが、使わずとも問題はありません。

  * `仮想環境や仮想マシンのような閉じられた環境下でインストールするのが良いのではないか`  
おっしゃる通り、ホストOS側でのインストールを行うと別の環境とぶつかる場合があるので、もし可能でしたら別の仮想マシンを用意してインストールするのがよいかもしれません。  
また、もしMySQLでなければならない理由がなければ、インストール不要でPythonとの親和性も高いSQLileを使うのが便利かもしれません。この場合、仮想環境を別途用意する必要もなく、簡単かと思われます。

# 蛇足

Vagrantを挙げたのでVagrantについて記述しましたが、Dockerなどのコンテナ技術を利用した仮想環境構築のほうが可搬性が高く、より最近の流れに沿っているので、もしご興味がおありでしたらそちらについても手を出すのをおすすめしておきます。
CC BY-SA 4.0
2018-08-28T03:32:26.400
47869
2018-08-28T03:32:26.400
29826
47863
answer
**1. 仮想環境、仮想マシンについて**

Webアプリの場合は、サービスが止まったり不具合が出た場合にそれを短時間で修正できなければ致命傷になります。パッケージのバージョンを変更すると適正に動作しなくなることがあるので、アプリ毎にパッケージのバージョンを管理することは必須です。そのため、`Vagrant`を使ったとしても汎用のUbuntuやCentOSのイメージを使う場合には仮想環境が必要になります。アプリのパッケージのバージョン管理は`Pipenv`を使うと便利です。

ローカルPC上に仮想マシンが必要かどうかは、Webアプリを何のために作っているかによります。質問者は、社内や受託向けのアプリを想定しているようなので、`Vagrant`を使うのはいいことだと思います。

ただ、Windows10であればWSLで対応できるし、Macであれば仮想マシンの必要はないという意見も出ると思います。でも、`Vagrant`は`linux`の勉強にはいいので使いたいのであれば`Vagrant`でいいのではないでしょうか。

もし、そのWebアプリをインターネットに公開しようと思っているのであれば、ローカルPCで開発やテストを行わなくてもでクラウド上でできるので、先に公開環境を検討したほうがベターです。

Dockerなどのコンテナ技術を利用した仮想環境構築は、サービスの規模がある程度あって開発者の人数も多い場合は有効な技術のですが、独学の個人開発では学習コストが高すぎます。HerokuやFirebase+GAEのような個人開発でも使いやすいサービスの方を使った方がいいです。

**2. MySQLは、仮想環境や仮想マシンのような閉じられた環境下でインストールするのが良いのではないか**

運用環境であれば、データベースにあるデータは非常に重要なものなので、Webアプリとは別に専用のサーバー（仮想環境）にインストールすることが多いと思います。また、ネットワークで接続して使用するものなので運用環境で必要なバージョン毎に1つあれば（レプリケーションが必要な場合はその必要数）運用できます。

しかし、この質問は開発環境に限った話と思うので、開発環境では問題がでればその時点で修正すればすむことです。そこまで気にする必要があるのかは疑問です。また、ネットワークで接続して使用するものなので開発環境で必要なバージョン毎に1つあれば開発には問題ありません。
CC BY-SA 4.0
2018-08-28T11:08:45.347
47884
2018-08-28T22:42:06.430
2018-08-28T22:42:06.430
15171
15171
47863
answer