2017-01-07 9 views
0

私は開発スコープで関数呼び出し "uuid_generate_v4()"を使用しています テストスコープではsqlite3を使用しますが、 "uuid_generate_v4()"がないためマイグレーションコードが機能しません。 私はこのプロンプトを再現できますか?knex、本棚を使用してsqlite3に関数を追加

connection.schema.createTableIfNotExists('notification', (table) => { 
    // UUID 
    table.uuid('id').primary().defaultTo(connection.raw('uuid_generate_v4()')) 

    // Adds a "created_at" and "updated_at" columns on the database, 
    // setting these each to "dateTime" types. 
    table.timestamps() 

    table.string('type', 255) 

    table.string('summary', 255) 

    table.string('text', 255) 

    table.string('actionText', 255) 

    table.string('actionUrl', 255) 

    table.uuid('recipient').references('user.id') 
}), 

failed with "create table if not exists "notification" ("id" char(36) default uuid_generate_v4(), "created_at" datetime, "updated_at" datetime, "type" varchar(255), "summary" varchar(255), "text" varchar(255), "actionText" varchar(255), "actionUrl" varchar(255), "recipient" char(36), foreign key("recipient") references "user"("id"), primary key ("id")) - SQLITE_ERROR: near "(": syntax error"

+1

環境をPostgreSQLに移行します。異なるデータベースを使って開発しテストすることは、テストの目的を破るものです。 –

+0

私はこれを知っていますが、私はsqlite3のどこの関数を使用する解決するように頼みたいです:) –

+0

質問に失敗した移行コードを追加すると、SQL dialect固有の実装を追加する方法が簡単になりますsqliteのuuidの生成方法が異なります。 –

答えて

0

MUが-で余りに短いコメント@として、是非とも私はこれを行うことはお勧めしませんが、これはそれを行うことができる方法です。

let uuidGenerationRaw = connection.client.config.client === 'sqlite3' ? 
    `(lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6))))` : 
    `uuid_generate_v4()`; 

connection.schema.createTableIfNotExists('notification', (table) => { 
    table.uuid('id').primary().defaultTo(connection.raw(uuidGenerationRaw)); 
    // ... rest of the columns 
}), 
テストスイッチ
関連する問題