2016-07-15 30 views
0

看起來,使用knex.js的一種非常好的方式是創建遷移來定義模式,然後在正常的node.js代碼中插入到所述模式中。knex.js可以在沒有遷移/播種的情況下使用嗎?這個knex.js代碼有什麼問題嗎?

有沒有辦法不使用遷移?我可以使用正常的node.js代碼中的knex.schema.createTable(...)函數嗎?有沒有這方面的文件?

編輯:我原本寫這個問題,因爲我認爲我不能執行knex.schema.createTable(...)函數從我的正常代碼庫。現在看來我無法在任何代碼中正確使用knex。如果我使用遷移爲SQLite3數據庫生成模式,它可以工作,但我似乎無法在遷移或其他方式中插入或查詢數據。

我遷移文件:

exports.up = function(knex, Promise) { 
    return Promise.all([ 
     knex.schema.createTableIfNotExists('test', function(table){ 
      console.log("creating user table"); 
      table.increments('id'); 
      table.text('test'); 
     }) 
    ]); 
}; 

exports.down = function(knex, Promise) { 
    return Promise.all([ 
     knex.schema.dropTableIfExists('test') 
    ]); 
}; 

knexfile.js:

module.exports = { 
    development: { 
     client:  "sqlite3", 
     connection: { 
      filename: "devel.db" 
     }, 
     useNullAsDefault: true 
    }, 
    deployment: { 
     client:  "sqlite3", 
     connection: { 
      filename: "deploy.db" 
     }, 
     useNullAsDefault: true 
    } 
}; 

而摩卡/柴測試,我寫道:

const chai  = require("chai"); 
var knex  = require("knex")({ client: "sqlite3", connection: { filename: "devel.db" }, useNullAsDefault: true }); 

var expect  = chai.expect; 

// The tests. 
describe("db",()=> { 
    it("Simple connect, query, and destroy.",()=> { 
     knex('test').insert({ test: 'wow' }) 
     .catch(function(e){ 
      console.error(e); 
     }); 
    }); 
}); 
+0

當然。只要數據庫存在,就可以實現它(無論是在knex中遷移,在liquibase中遷移,在任何任何東西中執行任務)。 – ssube

回答

0

您的遷移工作正常。在你的測試中,你需要返回knex對象來執行它。

describe("db",()=> { 
    it("Simple connect, query, and destroy.",()=> { 
    return knex('test').insert({ test: 'wow' }) 
     .catch(function(e){ 
     console.error(e); 
     }); 
    }); 
}); 

在回答真正的問題,是的,你可以。代碼與遷移代碼類似,但需要調用()或catch()來執行它。 Knex文檔涵蓋了這一點,但並不清楚。下面是修改遷移文件外模式的一個例子:

knex.schema.table('test', function (table) { 
    table.string('foo'); 
    table.string('baa'); 
}) 
.catch(function(err) { 
    console.log(err); 
}); 

修改數據庫模式時不遷移會更好地工作,我想不出有很多次,但取決於你的應用程序。

相關問題