如何在 knex.js 迁移中链接承诺
How to chain promises inside a knex.js migration
session-pg-simple 需要创建一个 table 来存储会话,我想将这个 table 添加到我的 knex.js 迁移脚本中。
CREATE TABLE "session" (
"sid" varchar NOT NULL COLLATE "default",
"sess" json NOT NULL,
"expire" timestamp(6) NOT NULL
)
WITH (OIDS=FALSE);
ALTER TABLE "session" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE;
CREATE INDEX "IDX_session_expire" ON "session" ("expire");
以上是来自https://github.com/voxpelli/node-connect-pg-simple/blob/HEAD/table.sql
的table创建脚本
exports.up = function (knex) {
return Promise.all([
knex.schema
.createTable("session", function (table) {
table.text("sid").notNullable().collate("default");
table.json("sess").notNullable();
table.timestamp("expire", { precision: 6 }).notNullable();
})
.then(
knex.schema.raw(
'ALTER TABLE "session" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE;'
)
)
.then(
knex.schema.raw(
'CREATE INDEX "IDX_session_expire" ON "session" ("expire");'
)
),
knex.schema.createTable("users", function (table) {
//...
}),
]);
};
初始 table 创建后的 2.then 没有 运行,我尝试在 Promise.all([]) 的末尾添加它们,但没有成功也不工作。
如何在我的脚本中实现这两行?
Promise.all
不需要那里,您在 then
块中错过了 return
语句。
反正你的代码可以大大简化,knex支持chaining,这意味着你可以创建一个方法链,一个接一个调用:
exports.up = function (knex) {
return knex.schema
.createTable("session", function (table) {
table.text("sid").notNullable().collate("default");
table.json("sess").notNullable();
table.timestamp("expire", { precision: 6 }).notNullable();
})
.raw(
'ALTER TABLE "session" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE;'
)
.raw(
'CREATE INDEX "IDX_session_expire" ON "session" ("expire");'
)
.createTable("users", function (table) {
//...
})
};
使用此代码,您无需更改 table 或在 raw
中创建索引:
exports.up = knex => {
return Promise.all([
knex.schema.createTable('session', function (table) {
table.string('sid').primary().notNullable();
table.json('sess').notNullable();
table.timestamp('expire', { precision: 6 }).notNullable();
})
]);
};
exports.down = knex => {
return Promise.all([knex.schema.dropTableIfExists('sessions')
]);
};
session-pg-simple 需要创建一个 table 来存储会话,我想将这个 table 添加到我的 knex.js 迁移脚本中。
CREATE TABLE "session" (
"sid" varchar NOT NULL COLLATE "default",
"sess" json NOT NULL,
"expire" timestamp(6) NOT NULL
)
WITH (OIDS=FALSE);
ALTER TABLE "session" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE;
CREATE INDEX "IDX_session_expire" ON "session" ("expire");
以上是来自https://github.com/voxpelli/node-connect-pg-simple/blob/HEAD/table.sql
的table创建脚本exports.up = function (knex) {
return Promise.all([
knex.schema
.createTable("session", function (table) {
table.text("sid").notNullable().collate("default");
table.json("sess").notNullable();
table.timestamp("expire", { precision: 6 }).notNullable();
})
.then(
knex.schema.raw(
'ALTER TABLE "session" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE;'
)
)
.then(
knex.schema.raw(
'CREATE INDEX "IDX_session_expire" ON "session" ("expire");'
)
),
knex.schema.createTable("users", function (table) {
//...
}),
]);
};
初始 table 创建后的 2.then 没有 运行,我尝试在 Promise.all([]) 的末尾添加它们,但没有成功也不工作。 如何在我的脚本中实现这两行?
Promise.all
不需要那里,您在 then
块中错过了 return
语句。
反正你的代码可以大大简化,knex支持chaining,这意味着你可以创建一个方法链,一个接一个调用:
exports.up = function (knex) {
return knex.schema
.createTable("session", function (table) {
table.text("sid").notNullable().collate("default");
table.json("sess").notNullable();
table.timestamp("expire", { precision: 6 }).notNullable();
})
.raw(
'ALTER TABLE "session" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE;'
)
.raw(
'CREATE INDEX "IDX_session_expire" ON "session" ("expire");'
)
.createTable("users", function (table) {
//...
})
};
使用此代码,您无需更改 table 或在 raw
中创建索引:
exports.up = knex => {
return Promise.all([
knex.schema.createTable('session', function (table) {
table.string('sid').primary().notNullable();
table.json('sess').notNullable();
table.timestamp('expire', { precision: 6 }).notNullable();
})
]);
};
exports.down = knex => {
return Promise.all([knex.schema.dropTableIfExists('sessions')
]);
};