Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

SQLAlchemyの結合条件の制御

モデル定義で外部キー定義する場合は、こんな感じでJOINできる。Flask-SQLAlchemyの場合です。

Order.query.join(OrderDetail, Customer, Destination, Item)

こんな感じのSQLが生成される。

FROM orders 
INNER JOIN order_detail ON order.id = order_detail.order_id 
INNER JOIN customer ON customer.id = order.customer_id
INNER JOIN destination ON destination.customer_id = customer.id 
INNER JOIN items ON item.id = order_detail.item_id 

今回はこのCustomerが曲者です。

CustomerはOrderの外部キーでもあるし、Destinationの外部キーでもあるという構成なので、この書き方をしてしまうと結合順が優先されて、顧客と納品先が結合されます。そうすると、顧客に対して納品先がN件ある場合、注文明細がN倍に膨れ上がって表示されてしまいます。

どうするかというと、結合条件をJOIN関数の第2引数にくれてやります。

Order.query.join(Customer, OrderDetail, Item).\
join(Destination, Destination.id == Order.destination_id)

こういうSQLに変わりました。

FROM orders 
INNER JOIN order_detail ON order.id = order_detail.order_id 
INNER JOIN customer ON customer.id = order.customer_id
INNER JOIN items ON item.id = order_detail.item_id 
INNER JOIN destination ON destination_id = Order.id 

はー、まじでAlchemyすごく便利。

Python3でZIP圧縮する場合の文字化け対策

結論

頼む!UTF8がわかるアーカイバソフト使ってくれ!!

qiita.com

ピンズドなエントリ。やはり人類はエクスプローラーによるZIP圧縮や解凍に困っていた。Windows7でUTF8がわからない場合に辛い。パッチがMSから公開されているが社内のセキュリティポリシーがどうだのかんなので、手を出せないという。Windows10ならUTF8がわかるようになっている。

ASCII文字でエンコード出来ない文字列があった瞬間に、強制的にUTF8でエンコードしている。いやね、そりゃそうなんだよ。全世界で使うんだから。

PythonのZipファイルエンコードの仕様をモンキーパッチを当てて逃げるというやり方しかないのが、Pythonで日本語ファイルを含むZipファイルを作る時の辛み。

dockerでWordPressのコンテナを作るときに、全てのファイルをマウントする方法

要は、/var/www/htmlフォルダそのものをvolumesでマウントする方法です。

volumes:
      - "$PWD:/var/www/html"

これでいけました。$PWDは、docker-composeしたディレクトリを指すようです。

Pyodbcで共有フォルダのMDBにアクセス

という検証をやったのでメモ。

眠くなったのでこれだけ。

Dockerのnginx-proxyでSSL化対応

何番煎じかわかりませんが。あっさり出来たのでメモ。

nginx-proxy 側の docker-compose.yaml

version: '3'

services:
  rg-proxy:
    image: jwilder/nginx-proxy:latest
    container_name: rg-proxy
    privileged: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./certs:/etc/nginx/certs:ro
      - ./vhost:/etc/nginx/vhost.d
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./html:/usr/share/nginx/html
    restart: always
    environment:
      TZ: Asia/Tokyo
  letsencrypt-nginx:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt-nginx
    privileged: true
    volumes:
      - ./certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./vhost:/etc/nginx/vhost.d
      - ./html:/usr/share/nginx/html
    environment:
      NGINX_PROXY_CONTAINER: rg-proxy
    restart: always

networks:
  default:
    external:
      name: sample_network

ポイントは、Let's Encrypt側の環境変数「NGINX_PROXY_CONTAINER: rg-proxy」です。volumes_from の例が多かったですが、Ver3から非推奨になりました。ログを見たらこの環境変数を設定してコンテナ名称を入れないとダメというエラーが出たので、設定したら動きました。

アプリ側のコンテナ

下記3つの環境変数をセットすれば動くようです。

  • VIRTUAL_HOST
  • LETSENCRYPT_HOST
  • LETSENCRYPT_EMAIL

IT企画をちゃんとやりたい勉強会

っていうのをやろうとしているんだけど・・・

プロジェクトの話を載せていくとNDA的にデンジャラスだし、講義っぽくなると「オレの方法論はこれだぜベイビーロック・ミー・ベイビー」みたいな感じになって寒くなる。

要件定義系はどうしてもメソドロジーの勉強会要素が強くなってしまうけど、いい感じに出せる事例を持ってきて上手いこと出来ないかな。

思案中。