クリックハウスのアクティブレコードの日時精度の問題
概要
私は gems clickhouse 0.1.10、clickhouse-activerecord 0.5.14、pg 1.4.6、rails 7.0.4.3 を持っています。 ClickHouse サーバー バージョン 23.4.2.11、postgresql サーバー 15.3。 私のクリックハウステーブルDDL:
create table default.tests
(
id UUID default generateUUIDv4(),
created_at DateTime64(6)
)
engine = MergeTree PARTITION BY toMonth(created_at) ORDER BY (id, created_at);
私のモデルはテストです。次のようなレコードを作成すると、
Test.create
これにより SQL クエリが生成されます。
INSERT INTO tests (created_at) VALUES ('2023-06-10 08:41:57')
ご覧のとおり、精度 (マイクロ秒) はありません。 次のように Rails time db 形式を定義できます。
Time::DATE_FORMATS[:db] = '%Y-%m-%d %H:%M:%S.%6N'
次に、レコードを作成すると、正しい結果が生成されます。
INSERT INTO tests (created_at) VALUES ('2023-06-10 08:41:57.123123')
しかし、これにより PostgreSQL モデルの SQL クエリが壊れてしまいました。たとえば、モデル PgTest があり、次のようなレコードを作成するとします。
PgTest.create
これにより、postgresql データベースに不正な精度の SQL クエリが生成されます (精度が重複します)。
INSERT INTO pg_tests (created_at) VALUES ('2023-06-10 08:41:57.123123.123123')
コールバック around_create で Time db 形式を設定する - 私にとってはオプションではありません。
解決策
これはバージョン 0.5.15、最後の 0.6.0 で修正されました。 Rails 7.1 以降の場合は、ブランチ Rails_7 を使用する必要があります。