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がわかるアーカイバソフト使ってくれ!!
ピンズドなエントリ。やはり人類はエクスプローラーによるZIP圧縮や解凍に困っていた。Windows7でUTF8がわからない場合に辛い。パッチがMSから公開されているが社内のセキュリティポリシーがどうだのかんなので、手を出せないという。Windows10ならUTF8がわかるようになっている。
ASCII文字でエンコード出来ない文字列があった瞬間に、強制的にUTF8でエンコードしている。いやね、そりゃそうなんだよ。全世界で使うんだから。
PythonのZipファイルエンコードの仕様をモンキーパッチを当てて逃げるというやり方しかないのが、Pythonで日本語ファイルを含むZipファイルを作る時の辛み。
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から非推奨になりました。ログを見たらこの環境変数を設定してコンテナ名称を入れないとダメというエラーが出たので、設定したら動きました。