Life is Really Short, Have Your Life!!

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

Python

Pythonで小数点の計算をする時、strでキャストすべし...

まじかよ... dev.classmethod.jp decimalモジュールに記載がある通り、float型ではなくstr型にすることで回避できます。 ですので、実装時にはstr型にキャストしたほうが良いと思います。 >>> from decimal import Decimal, ROUND_HALF_UP >>> (Decimal(1750…

SQLAlchemyのEager Loadingをいい感じにやる

SQLAlchemy==1.4.37 N+1のlazy fetchをしたくない場合、eager loadというJOIN時に予めデータを持ってくる方式があります。SQLAlchemyでも、Railsでも、この辺は一緒。Alchemyの場合、孫のテーブルをJOINした時もそれらが出来る。 数時間苦戦したので、Eager …

SQLAlchemy2.0スタイルメモ〜scalars〜

FastAPIならasyncで全部行きたいねってことで、プロダクトのコードをFlask→FastAPIに書き直している。 で、簡単なクエリの動作確認で、こんなコードを書く。 async def get_posts(db: AsyncSession) -> List[Post]: result: Result = await db.execute(selec…

PythonでJSONを任意の型にデコードしたい

How to convert JSON data into a Python object? - Stack Overflow 一番簡単なコードがこれ。 import json j = json.loads(your_json) u = User(**j) こういうモデルを定義して、以下のようなコードを書いてFastAPIに食わせたら、普通に動いた。 from typin…

Pycharmで"Couldn't refresh skeletons for remote interpreter"が出る

MacのDockerの設定の問題だった。 ここにUser Docker Compose v2とある。このチェックを外したらエラーが出なくなった。 $ docker --version Docker version 20.10.7, build f0df350 $ docker-compose --version Docker Compose version v2.0.0-beta.6 # suc…

SQLAlchemyのLazyLoadとEagerLoad

SQLAlchemyには、カラムを指定できるwith_entitiesという関数がある。こいつを指定してクエリを組み立てるときは、joinによって指定されたテーブルの中身を、予めもってきてくれるようだ。AlchemyのDebug=Trueで確認した。 db.session.query(Item).join(Cate…

SQLAlchemyの結合条件の制御

モデル定義で外部キー定義する場合は、こんな感じでJOINできる。Flask-SQLAlchemyの場合です。 Order.query.join(OrderDetail, Customer, Destination, Item) こんな感じのSQLが生成される。 FROM orders INNER JOIN order_detail ON order.id = order_detai…

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

結論 頼む!UTF8がわかるアーカイバソフト使ってくれ!!qiita.comピンズドなエントリ。やはり人類はエクスプローラーによるZIP圧縮や解凍に困っていた。Windows7でUTF8がわからない場合に辛い。パッチがMSから公開されているが社内のセキュリティポリシーが…

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

という検証をやったのでメモ。 pyodbcをpipで入れるだけ dsnのパスに全角文字があるとつながらないので、ネットワークドライブを割り当ててASCII文字だけに pyodbcはc++のライブラリが必要らしく、それを別途入れる必要があった。 【python】ライブラリイン…

IntegerFieldで「0」が入力エラーになる場合

validatorにDataRequiredを使っているせいです。InputRequiredに変更しましょう。

WTFormsでCheckBoxをグルーピングして表示する

こちらにCustom Widgetを利用して、チェックボックスのリストを作るコードがあった。Checkbox WTForms Example (in Flask) · GitHubListWidgetのコードを見ると、ulかolでマークアップしてくれる。一瞬メンドイなって思ったけど、CSSで調整できる余地を残し…

Pythonでdictを比較してassertしたい

単体テストのコードを書いていて、そういう局面にぶち当たりました。結論から言うとこれでOKです。 assert all( (k,v) in source_dict.items() for (k,v) in dest_dict.items() ) こちらを参考にしました。stackoverflow.com

SQLAlchemyでDB固有の関数を実行する

難しいことはありませんでした。以下はMySQLのtruncateという切り捨ての関数を使う例です。 rs = Item.query.\ filter(Item.maker_id == param['maker_id']).\ filter(func.truncate(Item.gedai / Item.price, 1) < 0.6).all() SQLAlchemyのfuncオブジェクト…

SQLAlchemyでクロス集計

こんな感じでできます。 import sqlalchemy from case, func rs = session.query(User,case[ func.sum(case([(User.blood_type == 'A',1)],else_=0)).label("A"), func.sum(case([(User.blood_type == 'B',1)],else_=0)).label("B"), func.sum(case([(User.b…

MySQLで履歴テーブルの最新を取りたい(Group ByとOrder By)

よくありますよね。履歴テーブルの最新を取りたいってやつ。履歴テーブルを顧客で集計して、その最新の履歴をゲットしたい。こういうやつだ。 select id, user_id, access_path, created from logs where year(created) = 2015 group by user_id order by id…

SQLAlchemyの_asdict() メソッドが無くなった

SQLAlchemyの1.0.9では、モデルオブジェクトをdictに変換してくれる _asdict() メソッドが無くなってしまったようです。no attribute というエラーが出た。すごく重宝してたのに・・・こちらを参考にして、切り替えました。stackoverflow.com def get_model_…

ダック・タイピングのメモ

ダック・タイピング - WikipediaJavaのようにjava.lang.Objectがすべての親になっており、必ず階層を必要とする考えで型を決定する場合は、その階層構造から型を決定することが出来るという話らしい。どの階層構造に属しているか否かで型の判別ができます、…

yield 構文がやっとピンと来たかもしれない

「yieldを実行すると、ジェネレーターを生成し現在の処理を中断したまま保持する事が出来ます」って何を言ってんのかサッパリわからなかった。やっとピンとくるコードがあった。What does the yield keyword do in Python?stackoverflow.com # -*- coding: u…

Pythonのexcept文はasキーワードで統一しよう

2.x系ではバージョンによってこう書ける。 #2.x try: pass except Exception, e: raise コメントでご指摘いただいたように、2.6以上であればasキーワードで使えるので、今どき2.6未満のPython使ってる人もそう多くない(だろう)から、下記の書き方で統一する…

SQLAlchemyの OperationalError: MySQL Connection not available エラー

Python3.4 && mysql-connector-python2.0.2で起きたこのエラー。表題の通り、コネクションプールをしているオブジェクトが利用できないと申される。接続は死んでないっぽいのが謎。活きているのに死んでいるみたいな、そんな感じのエラー。MySQL Server has …

Pythonでcsv/tsvを辞書の配列として読み込む

ちょー簡単。 import csv path = '/path/to/file' tsv = csv.DictReader(open(path), delimiter = '\t') for row in tsv: print(row) 1行目が辞書のキーになります。

WTFormsのSelectFieldで選択値(selected)を保持する方法

WTFormsはこの辺がイケてないのぅ。SelectFieldで選択した値を元に検索をかけると、Ajaxでもなければ初期値の値に戻ってしまう。SelectFieldにはdefaultというプロパティがあるが、これはコンストラクタでしか有効にならない。 #これだと選択値が入る select…

Flaskでフォームの配列のパラメータを取得して縦横に変換する

注文明細の数量を変更するような画面を作ってまして、こういうデータ構造でした。 ID 商品名 注文数 2 AAAA 3 3 BBBB 5 4 CCCC 6 5 DDDD 7 IDと商品名と注文数は配列で渡すので、こういうHTMLでマークアップします。 <input type="hidden" name="id[]" value="{{ od.id }}"> <input type="text" name="ordernum[]" value="{{ od.ordernum }}"> で、各々別の配列に入っている値ですが…

Pythonでオブジェクトが入ってるリストをGroupbyして配列に分割する

こんなオブジェクトが格納されているリストがあるとします。 name age sex foo 20 0 bar 30 1 hoge 40 0 それを性別で集計して各々別の配列に格納したい 作りたい配列はこんな感じ i_want_such_a_list = [ (0,(<foo,20,0>,<hoge,40,0>)), (1,(<bar,30,1>)) ] 簡単に出来た class SampleObj: </bar,30,1></hoge,40,0></foo,20,0>…

Python3.xでPDFを作成してFlaskで出力する

やっぱりwkhtmltopdfを使うのが一番簡単。reportlabとか重すぎる。Linuxで使う場合は日本語対応フォントのインストールをお忘れなく。wkhtmltopdfで、wkhtmltopdfのPythonラッパーライブラリがある。pdfkit 0.5.0 : Python Package Index pdfkit 0.5.0 : Pyt…

CentOS6.5でPython3.4+Nginx+uWSGIでバーチャルホスト運用

とりあえずなんとか動きましたって感じで... 以下Vagrant上での作業です。細かい所はあとで。 Python3.4を入れる $ sudo rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/CentOS/6/x86_64/ius-release-1.0-11.ius.centos6.noarch.rpm $ sudo yum instal…

FlaskでPaginationを実現する方法(Flask-SQLAlchemyを使用)

いやー、Flaskはドキュメントが断片的だ。マイクロフレームワークだとドキュメントもマイクロなんでしょうか。順番に追っていきます。 View部分のコードはこんな感じです。 from flask.ext.sqlalchemy import Pagination @app.route('/user', defaults={'pag…

generate_password_hashが毎回違う結果を返すのにパスワードとして使える理由

改めて読むと勉強になる。確かにここは気になる。Flask - generate_password_hash not constant output python - Flask - generate_password_hash not constant output - Stack OverflowFlaskでは色んなスニペットが登録されており、パスワードのハッシュに…

SQLAlchemyで検索条件の組立方法が知りたい件

how should i construct filters for multiple request parameters in SQLAlchemy?俺だよ俺。質問してみたよ....JavaのS2JDBCというグレイトなORMがあって、何がいいってこのSimpleWhere。検索条件に該当する変数がnullだったら無視してくれるので、ベタに検…

FlaskのBluePrintの簡単なサンプル

これはわかりやすい!英語だけど!blueprintが何をするのかよくわかった。http://www.guyjacks.com/2014/02/18/python-flask-blueprints-simple-example/