Techioz Blog

クリックハウスのアクティブレコードの日時精度の問題

概要

私は 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 を使用する必要があります。