この記事について
アイレット株式会社Advent Calendar2023 4日目の記事です!
私はこれまで主にMySQLを触ってきたのですが、Python + SQLServerで開発する機会がありましたので、そこでハマったポイントを3つ紹介していきます。
私自身、まだまだ経験の浅いエンジニアなので、正しくない内容もあるかもしれませんが、ご容赦ください。
SQLAlchemyとは
Pythonでよく使われているORM(Object Relational Mapper)です。
ORMとは、簡単に言うと、テーブルとクラスを対応づけて、データ取得・変更処理などを行う存在のことです。
SQLAlchemy公式ドキュメント
それでは、ハマったポイントについて紹介していきます。
1. カラムの照合順序名がSQLServer独自のものになる
開発を進めていく中で、エンコードはUTF-8にしたはずなのに、varchar型のカラムの日本語が文字化けするという事象に見舞われました。
調べた結果、SQLServerでは、char/varcharについては、そのカラムに適用される照合順序に応じた文字コードが採用されることがわかりました。
そこで、私は下記記事を参考に、テーブルの照合順序を変更し、さらにカラムもnvarchar型にすることで、日本語文字化けを解消することができました。
SQLServer照合順序確認方法
SQLServerデータベースの照合順序を変更する
datetime型がミリ秒まで表示される
SQLServerでは、仕様として、datetime型がミリ秒まで表示されるようになっているらしいです、
最初は、RDSのパラメータグループを変更すれば直ると思っていましたが、調べても全く出てこず、、結局、開発では日付比較などはやらなかったので、直さなくてもいいとなりました。
もし解決法を知っている方がいらっしゃいましたら、教えてください!
モデルでのバリデーションがうまく機能しない
SQLAlchemy公式ドキュメントにも書かれているのですが、SQLServer、特にpyodbcを使用していると、思わぬ動作を起こす場合があるようです、、私は一度もうまく機能しませんでした。
ですので、私の対処法としては、別途バリデーションするコードを実装しました。
FastAPIも使用していたので、新しくschemaを作成し、テーブルに追加する前のdict型のデータをバリデーションする形にしました。
Pydanticを使用したDataframeのバリデーション
SQLServer使用時のバリデーションの挙動
おわりに
ここまで読んでくださりありがとうございます。初めてのブログ投稿ということもあり、わかりにくい部分もたくさんあるかと思います。質問やご意見など、どしどし送っていただけると幸いです。