2023-07-15 SQLite strict オプション
SQLiteの型の扱いは雑
一般的なリレーショナルデータベースであれば、カラムの型がレコードによって異なるなんてことはありませんが、SQLiteはその限りではありません。
整数型と宣言したカラムにテキスト型のレコードを格納できます。
これはバグではなくて仕様のため、SQLiteのデータ型のドキュメント冒頭で丁寧に解説されていますし(“Flexible typing is a feature of SQLite, not a bug.”)、”The Advantages Of Flexible Typing“というそのものズバリのドキュメントも存在します。
SQLite3で型に厳格なSTRICTテーブルを作る | DevelopersIO
そんなSQLiteにstrictオプションが登場
STRICT Tables provide a prescriptive style of data type management, for developers who prefer that kind of thing.
SQLite Release 3.37.0 On 2021-11-27
SQLite3 って型があるようで何でもアリなので使えねぇって昔から言われてきたけど 2021 年に最近入った STRICT suffix を付けると厳密になるんですよね。 pic.twitter.com/gqpfKSm8Jl
— mattn (@mattn_jp) February 12, 2023
CREATE TABLEのときにSTRICTをつけると、そのテーブルに対しては型が厳密になるよう。
CREATE TABLE t1(a ANY) STRICT;
Rails v7.1からstrictオプションが利用可能
SQLiteの型の扱いが雑すぎてキレそうになってたけどRails でstrictオプションが使えるようになるらしい!(but Rails v7.1 から...) » Rails adds :strict option to the default SQLite database.yml file | Saeloun Blog https://t.co/hpjUJosxoi
— toshimaru (@toshimaru_e) July 14, 2023
対応されたPRは下記。
database.yml
に下記のstrict optionを追加すれば動くようだ。
development:
adapter: sqlite3
database: db/development.sqlite3
...
strict: true
追記(2023-07-31)
config.active_record.strict_strings_by_default
とあるように、Railsのstrict optionは STRICT Tables とは全く別物のようですね。