2024-01-01から1年間の記事一覧
始めに レコードの有効期間を表示したいときに、start_at, end_atのカラムを用いて表現していました。そして、end_atがnullの場合にアクティブなレコードとして表現しようとしていました。しかし、このやり方ではデータの管理方法に失敗するとアクティブなレ…
始めに 小ネタ。PythonでNestした配列に対して、flatなデータにしたいと思った時の処理を残します。 環境 Python 3.13 実装 構造が2階層だけならfrom itertools import chainのlist(chain.from_iterable(input_))を使用する。 from itertools import chain a…
始めに 小ネタ。 PyCharmにてryeやuvを直接指定することはまだできませんが、uvから生成される.venvは指定可能だということに気付いていなかったのでそれを記載するだけのメモです。 環境 PyCharm Professional 2024.3 ※ PyCharm Communityでもできるかもし…
始めに 弊社のシステムではECSを使用しているのですが、ここ最近Dockerイメージのビルド時間が大幅に延長されてしまっていました。そのうち、大幅な時間を占めているのがライブラリのインストール時間で、CPUの使用率が高くなって応答が非常に遅くなっていま…
簡単にBasic認証を実装したり検証したりするためにNGINXを使用しつつ、ついでにBasic認証まで含めているDockerイメージがあったので素振りしました。 環境 Docker 26.0.0 beevelop/nginx-basic-auth 対応 localhost:80にアクセスしたらBASIC認証がかかってお…
最近、自宅のPCでプログラミングをしていると非常に重くなり、フリーズを頻発してしまっています。そのため、早めに買い換えたいのですが、買い替えるまでに対応できることがないか思考錯誤したときのメモ。 なお、これを行ったことにより改善ができたわけで…
始めに PydanticでEmailStrを拡張するという記事を書きました。今回の記事では、PydanticでEmailStrを拡張するで行ったことをさらに拡張して、大文字小文字のどちらでもパラメータを受け取りつつ、小文字化してアプリケーションで受け取れるようにさらに拡張…
始めに pydanticにはEmailStrというemailを検証するための拡張クラスがあります。しかし、Emailの仕様としてはUTF-8を許容しているものの、システム的にはASCIIしか許容したくないことがあります。その場合に向けて、EmailStrを継承してASCIIのみ許容する拡…
始めに Pythonでデータをグループ化する際、defaultdictを使用すると簡単かつ効率的に実装できます。この記事では、defaultdictを使ったgroup_byの実装方法と、itertools.groupbyとの違いについて解説します。 環境 Python 3.12.6 実装 defaultdictを使用す…
Sentryの設定を軽い気持ちで変更したところ大規模障害につながってしまったので、もう忘れないようにするためのメモ。 環境 @sentry/angular-ivy 7.144.0 発生事象 S3へのファイルアップロードに失敗した。 原因 tracePropagationTargetsの指定を誤ってしま…
始めに PydanticにはJsonという便利な型があります。便利ではあるのですが、素のJson型では開発しづらい点があったので自分のアプリケーションでは拡張して使っています。 今回の記事では何に困ったのか、どのように拡張したのかを記載します。 環境 Python …
始めに email等の項目は大文字小文字を区別せずに比較したいことがあります。 その場合には小文字化して比較することになります。今回の記事では、PythonのSQLAlchemyで使用するlowerとilikeを素振りします。 環境 Python 3.12.3 SQLAlchemy 2.0.31 lower DB…
始めに 外部キー制約があるレコードを削除するとき、参照元テーブルよりも参照先テーブルを先に削除する必要があります。 Railsの場合、次のようにdependentに定義しておくと、Parentテーブルを削除したタイミングでChildテーブルも削除されます。 class Par…
始めに 自分用メモ。sqlalchemyではeager loadをする際にsubqueryloadとselectinload等々さまざまなload方法を指定できます。 しかし、片方はdeprecatedまでは設定されていませんが、非推奨なloading方法なのでそれを忘れないようにするための記事です。 環…
結論 pydanticではdefaultもdefault_factoryも同等の結果を返却しそう。 始めに 小ネタ記事。Pythonではデフォルト引数にミュータブルな値を指定したうえで、ミュータブルな操作を行うと、同じインスタンスを共有してしまいます。 def default_param(param: …
始めに 過去にPythonのenumはint等のプリミティブ型を継承すると便利という記事を投稿していました。 その後、Python3.11にてIntEnumやStrEnumが標準化されていることを知ったので共有します。 環境 Python 3.12.4 実装 intEnumの使用方法は次のとおりです。…
始めに FastAPIにてメソッドやクラスをDIできますが、DI時に部分的に処理を差し替えたい時があります。その時にパラメータを渡せば処理を差し替えられますが、少々ハマったのでそれをブログにします。 環境 Python 3.12.4 FastAPI 0.112.0 実装 同期処理の場…
始めに FastAPIではHTTPExceptionを使用すればHttpStatusを200以外でも返却可能です。しかし、エラー詳細は1つしか返却できません。ファイルのエラーハンドリングでは多数のエラーが発生した場合には、複数のエラーを返却したいユースケースがあります。 Exc…
始めに Pythonにてアプリケーション内ではdatetimeとして扱いつつ、APIとしてはYYYY-mm-dd等の特定のフォーマットの文字列で返却したいことがあります。 今回はPydanticを用いて実装する方法を記事にします。 環境 Python 3.12.4 Pydantic 2.8.2 実装 field_…
始めに 小ネタ。 更新系処理にて1000レコードあるemailが含まれているCSVをアップロードしたときに、DB側には999レコードしかない時には1レコード足りないために処理が失敗するとします。その場合どのレコードがDBに足りないかを調査する必要があります。 今…
始めに ※ 自宅で検証した際には実装できなかったので詳細は不明です。 テスト実装中に次のエラーが発生しました。 E sqlalchemy.exc.NoInspectionAvailable: No inspection system is available for object of type <class 'models.User'> 発生原因が不明ですが、発生しないように</class>…
2023年8月16日からできるようになっていたのを、単純に知らなかったので共有するだけのブログです。 ローカルで外部からAPIを実行する検証をしたい時があります。たとえばWebhookの検証だったり、Outlook連携の検証だったり。 そのときにローカルのAPIをHTTP…
自動テストの原則として、1テストに1検証とした方が良いです。これが複数あった時には失敗箇所が分かりづらくなってしまうため、その状態をバッドパターンとしてAssertion Rouletteと呼びます。 今回の記事では、PythonのTestフレームワークであるPytestを拡…
始めに 各月の第2営業日に処理したいバッチ処理がありました。 PythonのpandasのCustomBusinessMonthBeginで営業日を計算できそうだったので、各月の営業日を求める方法を記載します。 環境 Python 3.12.3 holidays 0.50 pandas 2.2.2 実装 祝日と営業日につ…
Pythonで営業日換算するときにpandasの型に営業日換算できる型があったので素振りしました。 なお、個人的にpolarsというpandasよりも高速処理できるライブラリに移行しようとしていますが、polars側には今回紹介する型がないので自作する必要があります。 …
例えばDBで論理削除しているユーザを画面上で表示する際に「削除済ユーザ」と表示したい。PythonのSQLAlchemyであれば、画面上の表示は「削除済ユーザ」としつつ、DBの値は元の「きり丸」としておくことが可能です。 今回の記事では、SQLAlchemyを使用してア…
Pythonでは3.10からパターンマッチングができるようになりました。Pythonではswitchではなく、matchで他言語のswitchと同等機能を提供できます。なお、当然ながらswitch文がない3.10以前はif... elif... elif... elseしかできないです。 環境 Python 3.12.3 …
処理高速化のためにSQLAlchemyを非同期処理で使用していると、気を付けないとMissingGreenletというエラーが発生します。その対策をブログにします。 環境 Python 3.12.3 sqlalchemy 2.0.30 ゴール AsyncSessionを使用している最中に、次のエラーが出たとき…
Gitでブランチを切って開発しているとローカルブランチはすぐに複数増えてしまいます。今回の記事では、リモートリポジトリが存在しない場合にローカルブランチもワンライナーで削除するためのメモ。 環境 Git 2.34.1 WSL Ubuntu 22.04.4 LTS ゴール マージ…
FastAPIでHTTPExceptionをログに出力しようとした時のメモ。 環境 Python 3.12.3 FastAPI 0.103.1 0.110.0 対応 少し古いFastAPIのライブラリなら、reprを使用してシリアライズしてください。もし、strで検証しても空文字列でなければ、そのままでも問題あり…