Pythonの環境構築とDBへのSQL実行例のメモ2018

#はじめに
最初は [LAMP+Wordpress+Python(Django)のセットアップメモ2018](https://qiita.com/YoshitakaOkada/items/117c60a105fd895e41c7) にVisualStudio環境構築についてをまとめたろうとしたけど、なんでか github からロードしたときに実行できないので、slack の pythonjp（ビギナー用スレ）に相談してみたらなるほどなぁという答えが返ってきた。しかし、当初のファイル構成と異なってくるため、 LAMP+Wordpress+Python(Django)のセットアップメモ2018 には混ぜ込まずに新記事としてまとめることにした。
ずっとviの黒い画面でゴリゴリやってきたけど、ちょっと立ち止まって作業環境を整えることは重要だよね。

#VisualStudio2017 ➡ Github の一方通行にしろ
Slack（pythonjp）での会話
>（yoshitaka）
みなさんのなかで開発環境にVisualStudioを使ってらっしゃる方はいますか？現在私はTeratermごしに、さくらのVPSの環境を直接 vi でいじる形で編集して（いまのところ）それなりに試作はうまくいっていて、githubに上げるようなこともしています。が、これをローカルPCのVisualStudio（以下VS）に持ってこようとしたときに、うまく動かせない状況に悩まされています。プレーンなDjangoプロジェクトをVSで新規作成するとデモページは表示されるけど、githubからロードしたときにはうまくいかない...いわばずっと本番環境で切った貼ったしてる状態というのは普通の開発では無いと思うので、開発環境⇔本番環境のキャッチボールってみなさんこのへんどうしてるのかなと思って質問します。VSのコードヒントとか使えると安心感が全然違うのでできればviじゃなくてこっちでやりたい...。そういうのが書いてある本でもあったら教えてもらえるとうれしいです

>（d-okuno）
回答になっていないかもですが、弊社で行なっている
全体の流れだけ記載します。
通常時は開発環境→本番環境の一方向になります。

>●本番環境→開発環境（弊社ではやっていませんが）
1.本番環境でpip freeze > requirements.txtのように依存ライブラリを書き出し
2.開発環境にファイルを全て取得
3.開発環境でvirtualenv等で該当プロジェクトの環境を作成
4.上記virtualenv内でpip install -r requiments.txtみたいな感じで本番環境と同じ依存ライブラリをインストール
5.IDEの設定（弊社ではIntellijを利用しているため、VisualStudioの設定がわかりませんが、少なくともIntellijではSDKとして、上記のvirtualenvを設定とsettings.pyのパスを通す必要がありますので、VisualStudioでも同じ様な対応が必要と思います。）
6.開発開始
（本番と開発のsettings.pyは分けています。開発ではsqlite 本番ではAzureSQLデータベースの様に）

>●開発環境→本番環境
1.ソースを修正しBitbucketやgithubなどにpush
2.Azure等では紐付けるリポジトリとブランチが設定できるため、自動デプロイとなります。
（デプロイのスクリプトは別途用意）
以下さくらVPSの自動デプロイの記事の様です。
https://qiita.com/abeyuya/items/773c26384297efe1f9a1


>（yoshitaka）
ははぁ〜。大変参考になります。
たしかに一方通行がいいような気がします。
さんざんスクラップアンドビルドもして、書くべき場所もわかるようになったので問題なしです。思った以上の回答が得られました。感謝します。きっと会社によってもやり方違うんでしょうねぇ。やっぱりsettingsも別物なんですね。しかし、本番⇔開発ってよくありそうだからもっと簡単なステップであってもおかしくないような気もしますがまだまだこれからの話なんでしょうねぇ。

>（ishimoto）
Visual Studioについては書いてありませんが、一般的なWebアプリ開発については [Pythonプロフェッショナルプログラミング第3版](https://www.amazon.co.jp/Python%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E7%AC%AC3%E7%89%88-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%93%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A6%E3%83%89/dp/4798053821/ref=sr_1_1?ie=UTF8&qid=1531983943&sr=8-1&keywords=python+%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB) にも解説があります。チームでの開発を行うための解説書なので、個人開発ではあまり必要がない部分も多いかもしれませんが。。。

>（yoshitaka）
>ありがとうございます。pythonの本は結構買ったつもりでしたがなぜかこれが漏れてました。ちょっと本屋で見て買う方向でいきたいと思います

#やりたいこと
このキャッチボールよね。vi（本番環境）とVisualStudio（開発環境）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/7a2ba17b-e45b-3cd5-5b70-139136f8b0b7.png)

#CentOSでのファイル構成
いままでCentOSで作ってきたファイル構成はこんな感じだったでしょう？

```text:CentOS（/home/op/app01/public_html/）
$ tree
.
┗ pj1
    ┣ app1
    ┃ ┣ admin.py
    ┃ ┣ apps.py
    ┃ ┣ forms.py
    ┃ ┣ migrations
    ┃ ┣ models.py
    ┃ ┣ static
    ┃ ┃ ┣ css
    ┃ ┃ ┃ ┗ styles.css
    ┃ ┃ ┣ files
    ┃ ┃ ┃ ┗ sample.csv
    ┃ ┃ ┗ js
    ┃ ┃     ┗ radarChart.js
    ┃ ┣ templates
    ┃ ┃ ┗ index.html
    ┃ ┣ tests.py
    ┃ ┣ urls.py
    ┃ ┗ views.py
    ┣ manage.py
    ┗ pj1
        ┣ __init__.py
        ┣ settings.py
        ┣ urls.py
        ┗ wsgi.py
```
[githubにも、この public_html 配下のファイル構成をアップロード](https://github.com/duri0214/Django)しています

#Windowsを再インストールしたときのメモ
VisualStudioをインストールして初回にDjangoやるときはDjangoが古いと思うのでdjangoをインストールしよう
##No module named 'django'
HDDトラブルがあってクリーンインストールから環境再現したあと、実行が失敗するようになった。結論から言うと画像の通り「pip install django」と入れれば良かったんだけど、なんだかエライ時間取られたなぁ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/301a5929-519c-7740-f811-606f8709601b.png)

##パスを通す
[環境変数PATHを設定する](https://www.pythonweb.jp/tutorial/install/index3.html)
勘所は2カ所のpathを登録するということとPythonがある位置とプロジェクトファイルのある位置を混同しないこと

###１．python.exeの位置を特定
・C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/97bff6e5-580b-a2d5-77ab-b66d7c5bda2a.png)

###２．環境変数の登録
・Python.exe のあるフォルダ
・Scripts フォルダを登録
・最後の円マークは不要
・Windows再起動（重要）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/983cf090-0afd-7544-166f-c0d808f30f78.png)

#VisualStudioでのファイル構成
staticフォルダとかtemplatesフォルダのなかで、appのフォルダを切る（赤い矢印）っていうのは僕がわかりやすさのためにやってなかっただけで、公式の推奨されたやり方ではあるから別にいいんだけど（pj1のなかでapp1、app2...とか増えてったときにアプリケーション名のフォルダを切らないとテンプレートの違いをDjangoが識別できない）、まぁそれはそれで文化としてこっちに慣れておいたほうがいい。やっぱりVisualStudioにしかない（しかしCentOS側では不要な）ファイルってのがどうもあるんだよね（緑の矢印）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/8b7dffdd-b43d-cbc3-c0c5-6f88fe87388e.png)

#VisualStudioにしかないファイルという誤解
##ただのWindowsエクスプローラ？
いや、よく見るとGithubから落としてきて、そのフォルダを開いている状態だとだめで、.slnをダブルクリックしてなかに入り込んで実行するとうまくいくんだ。なんだこれよくわかんねぇな:thinking:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/04ea9f22-26db-7b5d-e412-23890114e4b3.png)

##VisualStudioの基本？
と思ったら、あぁ～！VisualStudioが「こいつただのフォルダ見てんな？俺はそいつはしらねーよ」ってなってただけなのか。あくまでソリューションファイルを起点にしたいと。
http://www.atmarkit.co.jp/ait/articles/1704/21/news018_3.html

> VS 2017ではアプリ開発に必要となる情報をさまざまなファイルに保存しながら、それらをプロジェクトやソリューションといった論理的なグループにまとめて管理をしている。フォルダビューは、そうではなくフォルダ構造をダイレクトにソリューションエクスプローラーに表示するものだ。ここで見ているWindowsフォームアプリなどではこのビューの使い道はあまりない

ここで切り替えることもできます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/e34b5bbd-0f05-fc93-e09c-d747067b3ac8.png)

あぁ～なんかスッと整理が進んで勉強になったわ:relaxed:

#GithubからのCloneの場合
さっきも書いたとおり、おそらくフォルダビューという、単なるWindowsエクスプローラが表示されているので、ソリューションからの表示に切り替えましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/5bae04d1-0c3c-cfa6-e981-79517c1dbbf6.png)



#VisualStudioからの新規作成の場合
##Githubにリポジトリを新規作成
「Visualstudio-Django」とする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/5b5c7d77-e064-cbd3-5bcd-3133b1e208d9.png)

##サラのプロジェクトを作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/5dea56b5-cd94-b14a-fe90-50757209b47d.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/fd97c222-8b7f-f36a-4791-2ad3c9ea20fb.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/8467a38e-2a06-7bd6-3696-2eeb6dbaf99d.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/d7904a32-0088-ed7f-3248-2123972e914c.png)

##任意の場所にカラフォルダを作成
プロジェクト作ったばっかの時は temp 領域にあるらしい
カラのフォルダを作って（ここでは「Visualstudio-Django」とする）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/8886a525-5496-9acb-f606-0ea6b1c1abd0.png)

##ローカルGitリポジトリの指定
「新しいリポジトリ」を「Visualstudio-Django」に書き換えて「作成」
（さっき作ったカラのフォルダを指定した状態）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/7a14ca50-818b-54dd-698f-6f5544b6141c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/4dab004c-4783-a06a-640f-857f19afabee.png)

作ったばかりのローカルリポジトリのモードに変更
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/f25952a8-8f70-844e-03d0-1bb7d0791f57.png)


表示が変わった！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/9a707a6f-a1ce-0305-1753-e3326275a9d9.png)

設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/b4e82914-6535-c061-51ee-f780d59ed6cc.png)

リポジトリの設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/49695b63-8e3a-4dcc-d8ac-a5f7ecb7a5ec.png)

リモート、追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/308d9165-dd37-a50a-16f4-0a74ef8529bd.png)

フェッチのところは、いつものgithubのリポジトリURLをコピってくる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/f63104c5-ac29-c457-3539-c5e22b13da85.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/5dea9e71-0f29-d33f-c2bd-13a2a5176272.png)


##プロジェクトの保存
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/131f322f-ac30-484e-a250-52172de262be.png)


もうリポジトリ用にフォルダは切ってあるから両方必要なし
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/52a1efee-0723-1307-41c5-47682071723b.png)

#CommitとPush
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/964e1cfa-38ee-f312-6418-0fa174901e43.png)

コミットメッセージは「first commit」とする
「＋」のマークを押すとステージングされる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/218c61bf-69a1-1495-92ac-35ccc5603636.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/b63dfefb-f137-453a-2855-54b745980487.png)

まだコミットされただけだ（githubにはpushされていない）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/3ad0c3fb-2fed-5734-a868-bf73c13068e5.png)

Push！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/0443caaf-5839-0817-7d54-79a6d28837c8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/16b46225-10f4-b16c-a0c7-82fd6fa3a840.png)


#ようやくだ。。。
Visualstudioを使う人が少ないのか、全然参考に出来るところがなかった...つら。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/15ea5024-d4fb-ff9a-36dc-4b9d4ea6ba86.png)

#ソースコードを再現する
「構造」は一緒だからね。かんたんかんたん。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/7c056495-311c-2705-c79b-000e8e1f02b3.png)

しかし、実行が通らない...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/f328ae24-abbb-73aa-5613-83dda6761384.png)

##トラブルシューティング
###VisualStudioからpipをアップデート
...みたいなのをやってもダメなんだよなぁ～
原因は [DjangoでrunserverしたらImportError: cannot import name includeが出た。](https://qiita.com/mayu04120/items/b151cc716d0c42330769) のあたりだと思うけど。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/47ef9b2a-4671-9eca-3df0-c950f2c34cd6.png)

###ん？Djangoが1.1??
ひょっとして根元のライブラリインストールとかはDOSプロンプトからやんないといけないの？とかげんなりしながらまた1週間が過ぎた...ら気がついた。1.1???
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/51937528-7473-5842-d968-32100a2fba85.png)

どうやら [condaとpip：混ぜるな危険](http://onoz000.hatenablog.com/entry/2018/02/11/142347) この辺っぽいなぁ。原因が。そうそう。たしかに僕がAnacondaを使い始めるきっかけになったのもこういう感じ（[参考](https://qiita.com/YoshitakaOkada/items/d6d97c5954adae148b7a#db%E3%81%AB%E3%81%A4%E3%81%AA%E3%81%90python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E3%83%A1%E3%83%A2)）。
>筆者がPythonを使い始めた頃 （2013~2014年ぐらい）はPythonの公式側でパッケージ管理の仕組みがまだ整備途中の段階だった。特にWindowsではnumpyの様な（他言語で書かれたライブラリのコンパイルを伴う）パッケージをpipから入れるのは難しかった。そのため、非公式サイトからビルド済のファイルを逐一ダウンロードする必要があるなど不便が多かった。

>Anacondaではその辺の不便が解消されており、当時から一発で必要なパッケージをすべてインストールできた（今となっては大半のパッケージがpipで入れられるように整備されている）。

>・pipからしか入れられないパッケージを入れたい場合、新しいcondaの環境を作る(conda create -n env python)。その環境内ではconda installは一切用いない。
・Anacondaを使うのをやめる。Python公式サイトのPythonを使い、パッケージはpipで導入する。仮想環境についてはvenvやvirtualenvを用いる。

あれ？ということはいまはAnaconda使わなくてもプレーンなpythonセットアップでどうにかなりそうってことなのかい？
まぁこの辺の検証はあとだな。

現在のエラーはこんな画面。テーブルが見つけられない、なのでステップは進んだということだ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/9102be57-fa15-16f9-55af-96ced07e7e99.png)



#sqlite3のセットアップ
[データベースのセットアップ](https://qiita.com/kaki_k/items/7b178ad39394a031b50d#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)
[Microsoft公式：Django 管理コンソール](https://docs.microsoft.com/ja-jp/visualstudio/python/python-django-web-application-project-template#django-management-console)

##コンソールは無い！
CentOSでうにゃうにゃやってたコンソールが無ぇと migrate とかできねーじゃん？まじかよ Visualstudio で全部操作しきらないとはなんという片手落ち...。あくまで Python Tools for Visual Studio だからなの？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/1f498842-8a01-6c50-237f-459a093e960c.png)

##しょうがねー、やるか
あぁ～、もうすっかり「ls」とかのコマンドがしみ込んでてMS-DOSやりにくーい:innocent:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/d726e313-7ba8-30c4-a44d-b1dda8e43bb2.png)

```text:MS-DOS
~> cd C:\Users\Yoshitaka\Documents\Visual Studio 2017\Projects\Visualstudio-Django\pj
~Visualstudio-Django\pj> dir

 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 9A6A-D401 です

 C:\Users\Yoshitaka\Documents\Visual Studio 2017\Projects\Visualstudio-Django\pj のディレクトリ

2018/07/24  22:27    <DIR>          .
2018/07/24  22:27    <DIR>          ..
2018/07/30  20:20    <DIR>          app
2018/07/16  23:25            40,960 db.sqlite3
2018/07/21  15:32               340 manage.py
2018/07/24  22:27    <DIR>          obj
2018/07/24  22:52    <DIR>          pj
2018/07/24  22:46             6,149 pj.pyproj
2018/07/21  15:34               254 pj.pyproj.user
2018/07/21  15:34             1,102 pj.sln
2018/07/16  23:25            28,423 readme.html
2018/07/16  23:25                18 requirements.txt
               7 個のファイル              77,246 バイト
               5 個のディレクトリ  52,488,470,528 バイトの空き領域
```

###おぉん？
```text:MS-DOS
~Visualstudio-Django\pj> python
'python' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

###Pythonがある位置とプロジェクトファイルのある位置が違う
ギューっと狭い視点になると沼にハマる:innocent:

###１．pythonがある位置にパス（環境変数）を通す
[環境変数PATHを設定する](https://qiita.com/YoshitakaOkada/items/4941f4e12eb2f7b1c0a8#%E3%83%91%E3%82%B9%E3%82%92%E9%80%9A%E3%81%99)

###２．Migrate！（キタぞ！）
通ったーー！！！
WindowsでのPythonって鬼門すぎるだろ...ｗｗｗ:smiling_imp:

```text:MS-DOS（もういっかい）
~> cd C:\Users\Yoshitaka\Documents\Visual Studio 2017\Projects\Visualstudio-Django\pj
~Visualstudio-Django\pj> python manage.py makemigrations app
Migrations for 'app':
  app\migrations\0001_initial.py
    - Create model evaluation

~Visualstudio-Django\pj> python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app, auth, contenttypes, sessions
Running migrations:
  Applying app.0001_initial... OK
```

###３．VisualStudioから実行！
Github（CentOS版）から鬼のようなコピペで一気に再現。一部つっかえたけど（app1➡appなど）サクサク解決。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/b0c3060a-6f43-0b63-9c5c-f6e8788ec74e.png)

###４．再現できた！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/7f40cfc9-b8a0-3681-5924-7ea81d657f8d.png)

##ファイルアップロードができない？？
discord(pythonjp)に相談する直前のメモがあるので貼り付けよう
>追加で相談させてください。
おかげさまでVisualStudioでの開始ボタンを押してブラウザでdbテーブルの内容を表示するところまでいきました。

>が、CentOS版（※ここにURL）を見ていただくとわかると思うんですが、テーブルにCSVからInsertするボタンがあって、それを試そうとしたときに落ちました。
※以下「\\\」を「￥￥」に読み替えてください

>（そんなディレクトリはねーよ）
[Errno 2] No such file or directory: 'C:\\\Users\\\Yoshitaka\\\Documents\\\Visual Studio 2017\\\Projects\\\Visualstudio-Django\\\pj\\\app/static/files/sample.csv'

>views.pyはどうなっているか。じつはこの書き方でCentOS版は正しいパスが返るが、結果的にはスラッシュのバックスラッシュの混在が起こっている
UPLOAD_DIR = os.path.dirname(os.path.abspath(__file__)) + '/static/files/'

>実際に返ったパスを、Windowsエクスプローラーで追いかけてみるも当然怒られる
C:\\\Users\\\Yoshitaka\\\Documents\\\Visual Studio 2017\\\Projects\\\Visualstudio-Django\\\pj

>\を削ってWindowsエクスプローラーで追いかけてみる。当然表示される
C:\\Users\\Yoshitaka\\Documents\Visual Studio 2017\Projects\Visualstudio-Django\pj

>今回もWindwowsの鬼門のような気がしていて、この記述を変更してしまうとCentOSとの整合性が取れなくなりそうです。
UPLOAD_DIR = os.path.dirname(os.path.abspath(__file__)) + '/static/files/'

>これは、、、解決する方法があるんですかね、、、

###解決の結論としては、CentOSのほうを直そうと決めた
os.path.joinでOS間の垣根をなくして解決！
[Python、os.path.joinでパスを結合する](https://torina.top/detail/249/)

```python:修正前
UPLOAD_DIR = os.path.dirname(os.path.abspath(__file__)) + '/static/files/'
```
```python:修正後
UPLOAD_DIR = os.path.join( os.path.dirname(os.path.abspath(__file__)) , "static","app","files")
```

#アップロード機能の動確完了！
やったぜ！
あー、また1ヵ月経っちまった...ちょうど1か月:innocent:
いやぁ～、、これができた週の週末、燃え尽きた感じで、つぎになにするかが思いつかなかった...
Qiitaとかってこういう苦労の積み上げみたいなのが共有されるのがマジでIT以外にも広がってほしい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/005b5e79-20c2-59f0-0840-269b236c5695.png)