Node.js、knex、MySQL(Bookshelf経由)に共通の日付形式を見つけるのに問題があります。
Knexスキーマビルダーでテーブルを設定します。
knex.schema.createTableIfNotExists("examples", function (table) {
...
table.dateTime("some_datetime");
})
これにより、MySQLでDATETIME
タイプの列が作成されます。
これを表すBookshelfモデルがあり(ボイラープレートの要素はすべて省略しています)、組み込みのDate.now()
を値として使用しようとしています。
exampleModel.save({
some_datetime: Date.now()
})
Knexでデバッグをオンにすると、クエリが実際にミリ秒のエポックタイムスタンプを挿入しようとしていることがわかります(簡潔にするために「...」を使用)。
{ ...
bindings: [ 1485644012453, ... ],
sql: 'update `examples` set `some_datetime` = ? where `id` = ?' }
しかし、これは正しくありません。この場合、 MySQLは、FROM_UNIXTIME
を使用することを想定しているため、データベースの結果の日付は、もちろん、古き良き0000-00-00 00:00:00
です。
これをすべて一貫させるためにここで何をすべきですか?
Date.now()
以外に日付を取得するために使用する必要がある別のものはありますか?ここで共通点を見つけるのに苦労しています。私の直感は、KnexではdateTime
、NodeではDate.now()
、MySQLではDATETIME
を使用すると言っていますが、これは正しくありません。
明確にするために:この質問は、哲学的に正しいものに必ずしも焦点が当てられているわけではありません-現在のところ、allでデータベースに日付/時刻を格納する方法を実際に理解することができません。私は作業の組み合わせを探しています。意味の正確さはボーナスにすぎません。
JavaScript関数Date.now()
は、エポックをミリ秒で返します。 knex
usesを使用してクエリを送信するMysqlドライバーは、ISO8061文字列またはDate()
オブジェクトをDATETIME
列に渡すことを想定しています。
日付オブジェクトは「YYYY-mm-dd HH:ii:ss」文字列に変換されます
https://github.com/mysqljs/mysql
したがって、Date.now()
の代わりにnew Date()
またはnew Date().toISOString()
を使用します
編集:
Mysqlが.toISOString()
出力を本当に受け入れることを確認するだけで、ドキュメントからそれについての言及が見つからなかったため https://dev.mysql.com/doc/refman/5.7/en/date-and -time-type-overview.html
MariaDB [(none)]> select CAST('2017-01-30T16:49:19.278Z' AS DATETIME);
+----------------------------------------------+
| CAST('2017-01-30T16:49:19.278Z' AS DATETIME) |
+----------------------------------------------+
| 2017-01-30 16:49:19 |
+----------------------------------------------+
1 row in set, 1 warning (0.00 sec)
本当にそうです。わーい!すべて良い。
Date.now()
の代わりに、組み込みのnow()
関数 Knex.js を使用できます。
const knexfile = require('../../knexfile');
const knex = require('knex')(knexfile.development);
const date = knex.fn.now();
代替:
const knexfile = require('../../knexfile');
const knex = require('knex')(knexfile.development);
knex.raw('CURRENT_TIMESTAMP');