如何使用续集迁移/种子插入初始数据?
Posted
技术标签:
【中文标题】如何使用续集迁移/种子插入初始数据?【英文标题】:How to insert initial data using sequelize migrations/seeds? 【发布时间】:2016-01-24 06:01:13 【问题描述】:我正在尝试创建初始迁移以填充测试数据库,但我无法使其正常工作。这就是我在迁移中所拥有的:
'use strict';
module.exports =
up: function (queryInterface, Sequelize)
return [
queryInterface.bulkInsert('Users', [
username: "user1" ,
username: "user2"
])];
,
down: function (queryInterface, Sequelize)
return queryInterface.dropTable('Users');
;
我得到这个错误:
== 20151024144833-create-conjugation: migrating =======
[SequelizeUniqueConstraintError: Validation error]
name: 'SequelizeUniqueConstraintError',
message: 'Validation error',
errors: [],
fields: []
必须有更简单的方法来做到这一点。我检查了其他 SO 问题,但在当前版本的 sequelize 中语法发生了变化。
更新
好的,我意识到我的错误:我假设 sequelize 会处理时间戳。这解决了问题:
up: function (queryInterface, Sequelize)
console.log(User);
return [
queryInterface.bulkInsert('Users', [
username: "user1", createdAt: Date.now(), updatedAt: Date.now() ,
username: "user2", createdAt: Date.now(), updatedAt: Date.now()
])
];
但我仍然想知道这是否是为我的数据库播种的正确方法。有没有办法使用User.create()
做到这一点?
【问题讨论】:
我在使用Date.now()
时遇到了问题,需要将其替换为 new Date()
。使用 SQLite,无法查询数据库,因为时间以错误的格式保存(Uncaught TypeError: date.indexOf is not a function
in sequelize/lib/dialects/sqlite/data-types.js:28:14
)
【参考方案1】:
你可以使用下一个:
const City = sequelize.define('city',
name: type: Sequelize.STRING ,
order_: type: Sequelize.INTEGER
);
City.sync().then(() =>
City.create(
name: 'Neuquen',
order_: 0
);
City.create(
name: 'General Roca',
order_: 1
);
);
或在http://docs.sequelizejs.com/en/latest/docs/migrations/阅读有关“迁移”的信息
【讨论】:
相同的代码对我不起作用。重新运行我的应用程序(以便表已经存在)后,插入语句运行得很好,但是在第一次运行应用程序时(正在创建表)只有一些插入语句是成功的。【参考方案2】:new Date()
mysql也需要,即
return queryInterface.bulkInsert('users', [
"Forename":"A",
"Surname": "User",
"UserType":"1",
"Email":"auser@gmail.com",
"Password":"password",
"LastLogin":0,
"Tokens": JSON.stringify("tokens":[]),
"CreatedBy": 999,
"CreatedAt": new Date(),
"UpdatedAt": new Date()
]);
【讨论】:
【参考方案3】:可以使用替代方法:sequelize fixtures,您可以使用声明为 json 文件或其他格式的默认数据初始化表。
【讨论】:
【参考方案4】:对于 sequelize v6 的快速简便方法(无需种子或迁移):
我修改了我的sequelize.sync()
电话:
import Sequelize from 'sequelize';
// This will create an in-memory sqlite db
const sequelize = new Sequelize('sqlite::memory:',
logging: sequelizeLogger
);
await sequelize
.sync( force: true )
.then(() =>
// seed db
Users.create( username: 'user1' )
);
【讨论】:
永远不要在生产中使用同步。如果可能的话,我实际上会劝阻,因为如果您想稍后使用迁移,您似乎基本上必须重新开始创建模型。这也不是 OP 所要求的。以上是关于如何使用续集迁移/种子插入初始数据?的主要内容,如果未能解决你的问题,请参考以下文章