diadia

興味があることをやってみる。自分のメモを残しておきます。

その他centos7の環境構築

centos7にはlsofコマンドを使えるようにする

centos7 にはどうやらlsofコマンドが最初から使えるわけではないようだ。
そこでlsofコマンドを使えるための環境構築方法をメモしておく。
ちなみにlsof はLiSt Open Fileのことらしい。

インストール

# yum -y install lsof
# lsof -v

lsof version information:
    revision: 4.87
    latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
    latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
    latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
    constructed: Tue Oct 30 16:28:19 UTC 2018
    constructed by and on: mockbuild@x86-01.bsys.centos.org
    compiler: cc
    compiler version: 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
    compiler flags: -DLINUXV=310000 -DGLIBCV=217 -DHASIPv6 -DHASSELINUX -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DHAS_STRFTIME -DLSOF_VSTR="3.10.0" -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic
    loader flags: -L./lib -llsof  -lselinux
    system info: Linux x86-01.bsys.centos.org 3.10.0-693.17.1.el7.x86_64 #1 SMP Thu Jan 25 20:13:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    Anyone can list all files.
    /dev warnings are disabled.
    Kernel ID check is disabled.

よく使うやつ

gunicornのサービスを切りたいときはプロセスを確認する。

# lsof -i:8000

lsofコマンドの注意点

lsofコマンドでpidを把握する際に、コマンドを叩いたユーザーによって結果が異なる場合がある。理由はわからないが、一般ユーザではpidを表示することができないのにrootユーザになってコマンドするとpidが表示される事があった。注意である。

python manage.py collectstaticについて

静的ファイルを配信したいがファイルが集まらない

通常djangoは画像などの静的ファイルはnginxから配信する。
nginxから配信するに静的ファイルはサーバー内の静的ファイル置き場に設置する。

この設置を自動的に行なってくれるのが以下のコマンドである。

python manage.py collectstatic

しかしながら今回静的ファイルが集まらない。この原因がわからない。

 

 

対処できた

なぜかsettings.pyのSTATICFILES_DIRSの項目がコメントアウトされていた。これを戻したらファイルが集まった。

ssh周りを整理する

sshがよく分からなかったのでそのへんを調べなおす。
wikipediaによると、以下のようにまとめられる。

SSHはSecureShellのことでリモートコンピュータと通信するためのプロトコルである。ネットワーク上のすべての通信が暗号化される。SSHは共通の鍵を用いて暗号化し、盗聴を防ぐ。SSHは種類がある。最も普及しているのがOpenSSHで、Linuxで標準的に利用される。(標準搭載されているってこと?)。現在単にSSHというとOpenSSHの実装系を指す。またSSHは、SSHサーバーとSSHクライアントに分類ができる。

SSHサーバー:OpenSSH, SHH Tectia Server, Reflection for Secure IT
SSHクライアント:OpenSSH, PuTTY, XShell, TeraTerm

//サーバとクライアントのによる分類    

SSH----SSHサーバー ------- OpenSSH 
     |                 |-- SHH Tectia Server
     |                 |-- Reflection for Secure IT
     |
     |-SSHクライアント---- OpenSSH
                       |-- PuTTY 
                       |-- XShell
                       |-- TeraTerm
    

これらのことを踏まえると、SSHをドキュメントから調べたり、本で学習する際はSSHなるものを探すのではなく、その具体的なSSHの祖父手ウェア名を探すことが必要なのだろう。こういう背景からOpneSSHのドキュメントを読むに至った。 ドキュメント:https://www.openssh.com/

 

前提:そもそもなんでSSHが必要になるのか

自分のケースではデプロイに関係する。ローカルで開発したアプリケーションをデプロイするにはリモートのサーバーにファイルを送信すること、リモートサーバーでそのアプリを実行状態に操作することが出来なければならない。このリモート操作にSSHを使う。

OpenSSHの構成

ドキュメントに書いてあるとおり、OpenSSHは以下のツールで構成されているになる。

1. リモート操作を司るssh, scp, sftp    
2. 鍵の管理ツールであるssh-add, ssh-keysign, ssh-keyscan, ssh-keygen
3. サービスをつかさどるsshd, sftp-server, ssh-agent

OpenSSHのドキュメントの主要要素は各コマンドの簡単な説明とそのコマンドオプションについて説明してある。

sshコマンドについて新たに分かったこと。ドキュメント:https://man.openbsd.org/ssh.1

sshはリモートでマシンにログインし、リモートでマシンにコマンドを実行するソフトウェアである。クライアントとホストは暗号化によって安全な通信が得られる。

-i identity_file オプション

Selects a file from which the identity (private key) for public key authentication is read. The default is ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ecdsa_sk, ~/.ssh/id_ed25519, ~/.ssh/id_ed25519_sk and ~/.ssh/id_rsa. Identity files may also be specified on a per-host basis in the configuration file. It is possible to have multiple -i options (and multiple identities specified in configuration files). If no certificates have been explicitly specified by the CertificateFile directive, ssh will also try to load certificate information from the filename obtained by appending -cert.pub to identity filenames.

-iコマンドを使わないとデフォルトで適当な鍵が使用される、という仕様はどこかで見たことがあったが、ドキュメントに書いてあることを認識した。-iオプションでは公開鍵に対してどの秘密の鍵を使うかを指定する。指定しない場合はデフォルトで~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ecdsa_sk, ~/.ssh/id_ed25519, ~/.ssh/id_ed25519_sk, ~/.ssh/id_rsa.が使われる。

SSHとそれに関連するファイル、コマンドについて

sshd...クライアントからの接続を待つ。サービス(デーモン)。sshd_configの内容によって挙動が制御される。またsshdコマンドで挙動を制御することもできるようだ。
参考:https://man.openbsd.org/sshd#DESCRIPTION

sshd_config...sshdの挙動を制御する設定ファイル。sshdは/etc/ssh/sshd_configを読みこむ。sshd_configの仕組みは1つの設定項目につき1行で設定される。ある設定を意味するキーワードとその値で1行が構成される。#で始まる行は設定内容として反映されない。
参考:https://man.openbsd.org/sshd_config#DESCRIPTION

sshdsshd_configはSSHサーバー側のものである。

ssh-keygen...認証キーの生成、管理、および変換を司るコマンド。クライアント(ローカル)側で認証キーを作成し、認証キーのうち公開鍵(.pub)をサーバー側に渡す。このファイルの内容はauthorized_keysに書き込む流れになる。

authorized_keys...サーバー側の認証ファイル。ここに記載されたリストの内容は、認証キーを使ってログインすることができる。ログイン認証はクライアント側が秘密鍵をサーバーに渡し、サーバー側は公開鍵(パブリックキー)を使い認証可否を判断する。

別の言い方をすればauthorized_keysファイルには公開鍵の内容が書かれている。この公開鍵に対応した秘密の鍵をクライアントがサーバーに渡したときにクライアントは認証される。以下のコマンドはsshのサーバー環境を整える時に使う。単に公開鍵をauthorized_keys内に記入しているに過ぎない。

mkdir .ssh
chmod 700 .ssh
cat id_rsa.pub >> .ssh/authorized_keys
chmod 600 .ssh/authorized_keys


参考:https://man.openbsd.org/ssh.1#AUTHENTICATION

さくらVPSでcentos7をインストールする

何も見ないでcentos7をインストールすることが出来なかったのでメモしておく。

カスタムOSインストールガイド - CentOS7 / ScientificLinux7 / Fedora 28 – さくらのサポート情報

 

まず契約したサーバーを選択する。

そうすると起動、シャットダウン、コンソール、各種設定、解約のナブバーがあるのでそこから各種設定のドロップダウンから、OSの再インストールを選択する。

自分が躓いたのは、サーバーに空き容量がないためにreclaimをしてdelete allをする手順を踏まないと新たにcentos7を入れられないということに気が付かなかった。

 

 

 

 

ajaxをdjangoで使いたい

いくつか問題が生じてajaxが実現しない。

エラー対処したこと

まずbootstrapのStarter templateをそのまま使うとajaxが使えないことは知っていた。starter templateではslim版なのでmin版を使いなさいってことは情報収集でわかっていたことだ。

https://getbootstrap.com/docs/4.3/getting-started/introduction/#starter-template

...starter template 
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
    

というわけでmin版に変更する。
sterter templateのslim.min.jsからslimを削除してmin.jsにしてみたところconsoleでエラーが出てしまった。これに関してminに削除編集を行う方法では不適切であったことが判明した。参考資料:https://www.inet-solutions.jp/technology/jquery-ajax-bootstrap/

min用のものは全く別物であるからきちんとしたところから拾ってくること。これが1つ目の教訓であり注意点だ。

次にconsoleで生じているエラー

Uncaught ReferenceError: jQuery is not defined

このように表示されている。http://ch-mage.hatenadiary.jp/entry/2013/12/12/210939によるとjavascriptの読み込み順序が不適切だとエラーが出るようなことが書いてあった。試験的にajaxを行おうとしていたので、読み込み順序は自分も気になる箇所がある。ちょっと修正してみる。

エラー原因の明確な情報を得られた。当たり前と言われたら当たり前らしいことだけど、jqueryを読み込む前にjqueryのコードを実行することで自分のエラーが生じる。参考資料:http://mikaduki.info/webprogram/js/jquery/1192/

とてもわかり易かった。自分の場合では以下の構成になっていた。

...base.htmlにて
...省略
<body>
    {% block content %}
    {% endblock %}
    #以下にjQuery読み込みコード
    <script>省略</script>
</body>
...detail.htmlにて
{% extends "base.html" %}

{% block content %}
   detail.html特有の内容
   
  <script>ajaxのコード</script>
{% endblock %}

確かにテンプレートを統合すると、まずbase.htmlが読み込まれ中盤でdetail.htmlを読み込んだ後、base.htmlのjQuery読み込みの順序になる。だからエラーが出たということで間違いないだろう。 じゃあこのエラーを解消するためにはどのような順序を経なければならないか? {% block content %}中にjQueryが読み込まれることが必要だと考える。もっと言えば{% block content %}のscript読み込み前にjQueryのソースを差し込めばいいのではないか?

 

https://narito.ninja/blog/detail/88/

いつもお世話になっているナリトさんのブログに明快な解決方法があった。ブログどおりにjQueryのコードは別途{% block extrajs %}としてbase.htmlに追加するという方法を用いた。具体的にはbase.htmlでjQueryソースコードを読み込んで、更にajaxやbootstrapのスクリプトを読み込んだ直後に{% extrajs %}を書き込む。detail.htmlでは{% block content %}に加え、{% extrajs %}でajaxでどのように動くか書く。これだけでよかった。

django エラー:AttributeError: 'ManyToManyField' object has no attribute 'm2m_reverse_field_name'が出る

python manage.py makemigrations

をしたら以下のようなエラーが出た。

AttributeError: 'ManyToManyField' object has no attribute 'm2m_reverse_field_name'

エラーが出るまでの過程

models.pyをいじり、makemigrationsを終わったあとにmigrateした。

問題点はどのmodels.pyのどのクラスのManyToManyFieldからエラーが発生しているかエラー内容から判断する事ができない点だ。このエラー対処には以下の方法がある。

https://stackoverflow.com/questions/34698845/manytomanyfield-object-has-no-attribute-m2m-reverse-field-name

やり方はmigrationsディレクトリにある dependencies に係る内容を編集する手続きをとるようだ。自分の場合migration内のファイルを理解していないのでこの方法を採用しなかった。今となってはこの方法を採用して取り返しがつかなくなったら最終手段として自分の行なった方法を用いればより理解が深まる機会になったと思われる。

自分が行った方法

この方法は自分が客観的な根拠なくいじった結果エラーを解消した方法だから今後色々問題が生じる可能性がある。問題が生じたら追記することにする。

makemigration,migrateする結果各アプリのmigratinsに001...py,002...py,といったファイルが作られる。このファイルのdependencisの問題とのことだったのでこのファイルをすべて消す。
するとmigrateで新たに001_initial.pyがそれぞれのアプリ内に作られる。これでエラーが解消した。注意すべき点は__init__.pyは消さないことだ。このファイルはpython manage.py startapp *** で作られるファイルであり、migrateで作られるファイルではない。

JsonResponseについて

JsonResponseは今の所ajaxを利用するときに使うという認識だ。

 views.pyでは以下のような感じで関数ビューを書く。

views.py...
from django.http import JsonResponse

def ajax_post(request):
    if request.is_ajax == True :
        json_data = { "result" : "success"}
        return JsonResponse(json_data)
    else:
        print("Failed")
        json_data = { "result" : "failed"}
        return JsonResponse(json_data)

今回自分が分かったことは、returnでJsonResponseを返すということはどんな効果があるか?についてだ。

JsonResponseを使うのは言うまでもなくajaxに使うためのなのだけれども、JsonResponseを単独で使うとブラウザのデベロッパーツール上でjson_dataが表示されることがわかった。

jQueryのDOM操作

参考資料

http://www.koikikukan.com/archives/2013/07/16-003333.php
とてもわかりやすい。

DOM要素を新しく作る場合

新しく要素を作る場合以下のようにタグを書く。タグとして書かないとそれはセレクタとしての意味になるので注意する。

var p = ${"<p>"}; 
var p = ${"<p></p>"}; #又はこのように書いても良い。

新しく作ったDOM要素にコンテンツを入れる場合

html()メソッドを使う。

p.html("今日の出来事");

新たに作ったDOM要素を既存のDOMに追加する場合

メソッドは3種類ある。append(),prepend(),html()をつかう。使い方は追加したい要素をセレクタで指定し、メソッドを使う。

$("body").append(p) #bodyの子要素最下位末尾に追加できる。
$("body").prepend(p) #bodyの子要素先頭に追加する
$("body").html(p) #body要素を内容を新規作成としてpを加える。

 

DOM要素を新しく作り第二引数を取ることについて

新しく要素を作るとき同時に属性を定めることもできるようだ。
https://qiita.com/kazu56/items/8e92d08fd1bba0a2d771
その場合ブラケットで括る。以下のようなイメージ。

var a = $("<a>",{属性:値});
var a = $("<a>",
{ href:"asbua.jp/shu/page",
  "class" : "sample"});

そして第2引数は属性のみではなくjQueryのメソッドも扱える。例えばtext()メソッドを扱うことができる。

var p = $("<p>",{ text:"message"});

django TabularInline について

TabularInlineについて

tabularinlineをよくわかっていない。よく理解した頃に再編集するとするが、今立てている仮説とサンプルを残す。

サンプル

 

admin.pyにて

class AnswerTabularInline(admin.TabularInline):
    model = Answer
    
class QuestionAdmin(admin.ModelAdmin):
    inlines = [AnswerTabularInline]
    
    class Meta:
        model = Question

こんな感じで書くとTabularInlineが使えるようになるらしい。

そもそもインラインって?

おそらくinline , TabularInlineってのはForeignKeyと関係があるのかもしれない。あるモデルとそのモデルに紐付けられたものを同時に表示させる役割なのではないのか?djnago adminでquestionにAnswereを表示させることができたからそういう役割を果たすのかもしれない。理解が進んだらまた書き直す。

sqlite3を使ってみる

使う経緯

apiスクレイピングで取得したデータはcsvモジュールで管理をしてきた。この方法にはデメリットが有る。それはcsvファイルやpyファイルが量産されてしまうことだ。
そこでdjangoのアプリケーションを作り、リレーショナルなデータベースで管理することにした。
これは出力されたcsvファイルの管理やcsvを出力するpyファイルの管理を省くことが出来て改善された。
しかしながらまだ快適ではなかった。
なぜなら、データのインポートやエクスポートが面倒だし、その上djangoのサーバーを起動しなければいけないのは煩わしい。
djangoのdbであるsqlite3を直接いじれば更に楽に管理できるのでは?と思ったのがsqlite3を使うきっかけになった。

 

sqlite3でできるようになりたいこと

  • テーブルの作成
  • csvデータのインサート
  • csvファイルの出力
  • apiを混じえてデータのアップデート

 

この記事の内容一覧

  1. sqlite3モジュールのダウンロード、インストール
  2. テーブルの作成
  3. csvデータのインサート
  4. sqlite3に格納されたデータの表示
  5. データのアップデート
  6. executeメソッドの整理
  7. テーブルのカラムを参照する方法
  8. sqlite3の大文字、小文字の取り扱い
  9. sqlite3のGUI

sqlite3モジュールのダウンロード、インストール

参考文献:https://docs.python.org/ja/3/library/sqlite3.html

上記によるとsqlite3はpythonの標準ライブラリである。したがってダウンロード、インストールの手続きは不要である。sqlite3モジュールを使う際は以下のようにimportすれば良い。

import sqlite3

 

テーブルの作成

参考文献:https://docs.python.org/ja/3/library/sqlite3.html

import sqlite3
connection = sqlite3.connect(dbpath) # この場合つなぐ先はファイル
# 例えばconnectの引数として"mydb"とした場合でmydbがなければ、新たにmydbというファイルが作成される。
# 新たにdbのファイルを作る場合は、拡張子がなくても作ることができるが、他のモジュール利用のためにも.sqlite等の拡張子をつけるべき。


cursor = connection.cursor()

#create table
cursor.execute("CREATE TABLE mydb (url TEXT, part TEXT)")

テーブルの作成はexecuteメソッドを使う。executeメソッドの引数にはテーブル作成のSQL文をわたす。これがテーブル作成のイメージである。

 

csvデータのインサート

参考文献:https://docs.python.org/ja/3/library/sqlite3.html

import sqlite3
conn = sqlite3.connect("mydb.sqlite")

cur  = conn.cursor()
#insert 
cur.execute("INSERT INTO mydb VALUES (?, ?)", (a,b))

 

INSERTに関しては記法が2つあるようだ。どちらもpostgresqlと同じ書き方ではない。

個人的にqmarkスタイルが書き易いと思った。

SQL実行メソッドであるexecuteの記法については以下を見ると良い。

https://docs.python.org/ja/3/library/sqlite3.html#sqlite3.Cursor.execute

データ型としてはデフォルトで以下のものに限られている。

SQLite はネイティブで TEXT、INTEGER、REAL、BLOB および NULL のみをサポートしています。その他のタイプを使用したい場合はあなた自身で追加しなければなりません。detect_types パラメータおよび、register_converter() 関数でモジュールレベルで登録できるカスタム 変換関数 を使用することで簡単に追加できます。

データ型については以下に説明があった。 https://www.dbonline.jp/sqlite/type/index1.html

 

sqlite3に格納されたデータを表示するには?

INSERTしたデータをどうやって表示するか?

sqlite3はファイル形式のデータベースではあるけれども、それ自体を直接読み込むことはできない。データを表示するには、コンソールで表示する方法、csvファイルに出力しcsvファイルを読み込んで表示する方法がある。

データ表示は他のデータベースの操作と同じく、SELECTを用いて処理する。
例えばpostgresqlでは以下のように書いた。

SELECT * FROM mydb;

 

sqlite3ではSQL文をexecute()の引数とすればデータを参照できる。

import sqlite3
conn   = sqlite3.connect("mydb.sqlite")  # mydb.sqliteというファイルに接続する
cursor = conn.cursor()

cursor.execute("SELECT * FROM mydb") #mydb.sqliteの中のmydbテーブルを参照する。
# 全件取得 一件の場合はfetchone()を使う
res = cursor.fetchall()
for line in res:
    print(res)

 

これでコンソールからデータを表示できる。あとはcsvモジュールを使えばcsvファイルとしても利用できる。

 

UPDATEについて

postgresqlでは以下のような感じでUPDATEしていた。

UPDATE mydb SET url="dauduia" WHERE part="today"

sqlite3の場合ではこのSQL文を引数として利用すれば良い。しかし、sqlite3特有の書き方を用いる。

import sqlite3
conn = sqlite3.connect("mydb.sqlite")
cur  = conn.cursor()

cur.execute('UPDATE mydb SET url=? WHERE part=?',(a,b))
# urlにaの値が使われ、partはbの値が使われる。

executeメソッドの整理

まずSQL文を実行するメソッドがexecute()である。そしてexecute()の引数としてSQL文を書く。
しかしながらこのSQL文はpostgresqlと同じものではない。sqlite3特有の書き方である。 この特有の書き方は2種類ある。qmark記法、named記法である。qmarkではSQL文の入力値は?を便宜的に書く。そして実際の入力値は第二引数のタプルで渡す。
イメージでは以下のような感じだ。

cursor.execute("?を使ったSQL文",(実際の入力値))

executeメソッドで行えるのはSQL文なのでCREATE TABLE やSELECT, UPDATE INSERT である。

# CREATE 
cursor.execute("CREATE TABLE mydb (url TEXT, part1 TEXT, part2 TEXT)")

 

# INSERT
cursor.execute("INSERT INTO mydb VALUES (?, ?, ?)",("https://fdsahfufbsaui.com", "zxzxzx", None  ))
#postgresqlでは右のように書く。INSERT INTO mydb VALUES (a, b)

 

# UPDATE
cursor.execute("UPDATE mydb SET url=? WHERE part1=?",("urlの入力値", "part1の入力値"))

#複数値のUPDATEの場合
cursor.execute("UPDATE mydb SET url=?, author=? title=? WHERE part1=?", ("urlの入力値","authorの入力値","titleの入力値"))
#>postgresqlでは右のように書く。UPDATE mydb SET url="dauduia" WHERE part1="today"

INSERTやUPDATEは実際の入力値を伴うものだからSQL文の中に?を記述することになる。一方CREATE TABLEやSELECT文はデータベースに入力する値がないためSQL文そのままで書くことになる。

カラムを追加する方法

postgresqlでは以下のように書く。

ALTER TABLE mydb ADD COLUMNS column_a CHAR 

sqlite3は以下のように書く。

cur.execute("ALTER TABLE mydb ADD COLUMN column_a TEXT")

executeのメモ

例えばテーブルのあるカラムのデータ型をREALとして定義する。そしてフィールドとして-1(INTEGER)をUPDATEで渡したらどうなるか?
結果はエラーが出ることなくexecute()メソッドが実行され、結果が-1.0としてデータが格納された。

 

テーブルのカラムを参照する方法

参考文献:https://docs.python.org/ja/3/library/sqlite3.html#sqlite3.Cursor.description

cursorオブジェクトにはdescripyionアトリビュートがある。これを使うとテーブルのカラムを参照することができる。

 

descriptionの使用例:
import sqlite3

conn = sqlite3.connect("mydb.sqlite")
cur  = conn.cursor()
cur.execute("SELECT * FROM mydb_jp") #クエリを発行することがdescriptionを使う前提
res = cur.fetchone()
for line in res:
    print(line)
    
print(cur.description)

この状態だと各タプル内の無駄なもの(None)も表示されてしまう。リスト型データとしてcolsを出力する。 

カラムをリスト型データ("cols")に格納
import sqlite3

conn = sqlite3.connect("mydb.sqlite")
cur  = conn.cursor()
cur.execute("SELECT * FROM mydb_jp") #クエリを発行することがdescriptionを使う前提
res = cur.fetchone()
cols = list()
for col in cur.description:
    cols.append(col[0])

print(cols)

 

DEFAULT値の設定について

add columnsでもcreate tableでもColum名 データ型 DEFAULT デフォルト値の形式にすれば設定できる。

参考:https://www.dbonline.jp/sqlite/table/index12.html

sqlite3の大文字、小文字の取り扱いについて

sqlite3の場合大文字、小文字の取り扱いに区別がないことが判明した。
例えばimageUrl1,imageUrl2というカラムを備えたテーブルを作りデータを格納する。これをSELECT文で参照するときIMAGEURL1でもimageURL2でも参照することができた。UPDATEにおいても文字の大小は区別関係なくSQL文を実行できた。

 

sqlite3のGUIを導入すると便利

参照文献:https://intellectual-curiosity.tokyo/2018/10/15/sqlite%E3%81%AEgui%E3%83%84%E3%83%BC%E3%83%AB-db-browser-for-sqlite/
http://sqlitebrowser.org/dl/
上記リンク先からダウンロードする。直感的なのでテーブルの中身やテーブルのカラム構成など快適に確認できる。

django csvを出力する

やりたいこと

とにかくファイルの出力の基礎を学びたい。今回はcsvファイルをdjangoに投げて、重複するデータは削除し、csvとして出力する仕組みを作ってみる。

 

未知な部分

  • 出力した結果をhtml上ではどう表現するのか?イメージではアンカーをクリックでダウンローする形にしたい
  • アンカーに設置するのはcsvファイルってことで良いのか

requestsでAPIを利用する際のJSONの取り扱いについて

APIを使うのイメージ

APIを使うイメージは、あるドメインに何かアイテムを投げつけて、返ってきたオブジェクトを加工修正して利用する。pythonでは例えばrequests.getを使ってオブジェクトを得る。データをいじるにはJSON形式のデータとして返されることが多い。JSON形式のデータについて対応できるとpythonSDKがなかったとしても対応できるようになる。

JSON形式のデータについてはrequestsのメソッドが用意されているので難しいことはない。

変換の仕方

response  = requests.get(hoge)
json_data = response.json()
print(type(json_data))

requests.getで返ってきたオブジェクトにjson()を使うだけで良い。あとは見やすくするためにpprintを使うとデータの構造を理解しやすくなる。

import pprint          #pprintは標準ライブラリなのでインストールする必要はない
pprint.pprint(json_data)