7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

意外と知らない!? SQLAlchemy + SQLServerの落とし穴3選

Posted at

この記事について

アイレット株式会社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使用時のバリデーションの挙動

おわりに

ここまで読んでくださりありがとうございます。初めてのブログ投稿ということもあり、わかりにくい部分もたくさんあるかと思います。質問やご意見など、どしどし送っていただけると幸いです。

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?