Instances-Instances本系列文章的应用实例已发布在GitHub上:sequelize-docs-Zh-CN。您可以Fork以帮助改进或Star以关注更新。欢迎星。构建非持久性实例为了创建已定义类的实例,请执行以下操作。如果您以前写过Ruby,您可能会认得语法。使用build-此方法将返回一个未保存的对象,您必须显式保存它。constproject=Project.build({title:'myawesomeproject',description:'wootwoot.这会让我成为一个有钱人'})consttask=Task.build({title:'指定项目想法',description:'bla',deadline:newDate()})内置实例在定义时会自动获取默认值://首先定义模型constTask=sequelize.define('task',{title:Sequelize.STRING,rating:{type:Sequelize.STRING,defaultValue:3}})//现在实例化一个对象consttask=Task.build({title:'veryimportanttask'})task.title//==>'非常重要的任务'task.rating//==>3要将其存储在数据库中,请使用save方法并捕获事件(如果需要):project.save().then(()=>{//callback})task.save().catch(error=>{//uh})//你也可以使用链式构建来保存和访问对象:Task.build({title:'foo',description:'bar',deadline:newDate()}).save().then(anotherTask=>{//你现在可以使用变量anotherTask访问当前保存的任务}).catch(error=>{//糟糕,做一些错误处理})创建持久化实例除了构建对象外,还需要显式保存调用以存储在数据库中,所有这些步骤都可以用一个命令执行。这叫做创造。Task.create({title:'foo',description:'bar',deadline:newDate()}).then(task=>{//你现在可以通过变量task访问新创建的任务})也可以定义哪些属性可以通过create方法设置。如果您根据可由用户填写的表单创建数据库条目,这会很方便。例如,使用这种方式,您可以限制用户模型只设置用户名和地址,而不是管理标志:User.create({username:'barfooz',isAdmin:true},{fields:['username']}).then(user=>{//让我们假设isAdmin默认为false:console.log(user.get({plain:true}))//=>{username:'barfooz',isAdmin:false}})Updating/saving/persistinganinstance现在可以更改一些值并将更改保存到数据库中...有两种方法可以做到://方法一task.title='averydifferenttitlenow'task.save().then(()=>{})//方法2task.update({title:'averydifferenttitlenow'}).then(()=>{})通过传递一个列名数组,你还可以定义在调用保存属性时应保留哪些。当您根据先前定义的对象设置属性时,这很有用。例如。如果您以Web应用程序的形式获取对象的值。此外,这由update在内部使用。它是这样的:task.title='foooo'task.description='baaaaaar'task.save({fields:['title']}).then(()=>{//标题现在是“foooo”,whiledescriptionisthesameasbefore})//使用等效的更新调用如下:task.update({title:'foooo',description:'baaaaaar'},{fields:['title']}).then(()=>{//titlenowwillbe"foooo"anddescriptionwillbesamebefore})当你在不改变任何属性的情况下调用save时,这个方法什么都不做。Destroy/DeletePersistenceInstance一旦你创建了一个对象并获得了对它的引用,你就可以从数据库中删除它。相关方法是destroy:Task.create({title:'atask'}).then(task=>{//获取任务对象...returntask.destroy();}).then(()=>{//任务对象已被销毁})如果paranoid选项为true,对象不会被删除,但deletedAt列会被设置为当前时间戳。强制删除,可以将force:true传给destroy调用:task.destroy({force:true})批量操作(一次创建、更新、销毁多行)除了更新单个实例,还可以创建,更新和删除多个实例。调用您需要的方法Model.bulkCreateModel.updateModel.destroy由于您正在使用多个模型,回调不会返回DAO实例。BulkCreate将返回一个模型实例/DAO数组,但与create不同,它们在结果值上没有autoIncrement属性。update和destroy将返回受影响的行数。先看bulkCreateUser.bulkCreate([{username:'barfooz',isAdmin:true},{username:'foo',isAdmin:true},{username:'bar',isAdmin:false}]).then(()=>{//注意:这里没有凭据,但现在你需要...returnUser.findAll();}).then(users=>{console.log(users)//...来获取用户对象的数组})一次更新几行:Task.bulkCreate([{subject:'programming',status:'executing'},{subject:'reading',status:'executing'},{subject:'programming',status:'finished'}]).then(()=>{returnTask.update({status:'inactive'},/*设置属性的值*/,{where:{subject:'programming'}}/*whererule*/);}).spread((affectedCount,affectedRows)=>{//.update返回数组中的两个值,所以我们使用.spread//请注意affectedRows只支持返回:trueDefine//affectedCount将为2)然后删除它们:Task.bulkCreate([{subject:'programming',status:'executing'},{subject:'reading',status:'executing'},{subject:'programming',status:'finished'}]).then(()=>{returnTask.destroy({where:{subject:'programming'},truncate:true/*这会忽略where并用truncatetable替换*/});}).then(affectedRows=>{//affectedRows将是2returnTask.findAll();}).then(tasks=>{console.log(tasks)//显示任务内容})如果您直接从用户那里接受值,最好限制实际插入的列。bulkCreate()接受一个选项对象作为第二个参数。这个对象可以有一个fields参数(一个数组)来让它知道你想要显式构建哪些字段User.bulkCreate([{username:'foo'},{username:'bar',admin:true}],{fields:['username']}).then(()=>{//admin不会建})bulkCreate本来是主流/快速的插入记录方式,但是有时候你希望能够同时插入多行而不用牺牲模型验证,即使您明确告诉Sequelize要过滤哪些列。您可以通过向选项对象添加一个validate:true属性来做到这一点。constTasks=sequelize.define('task',{name:{type:Sequelize.STRING,validate:{notNull:{args:true,msg:'namecannotbenull'}}},code:{type:Sequelize.字符串,验证:{len:[3,10]}}})Tasks.bulkCreate([{name:'foo',code:'123'},{code:'1234'},{name:'bar',code:'1'}],{validate:true}).catch(errors=>{/*console.log(errors)看起来像这样:[{record:...errors:{name:'SequelizeValidationError',message:'Validationerror',errors:[Object]}},{record:...errors:{name:'SequelizeValidationError',message:'Validationerror',errors:[Object]}}]*/})实例值如果你记录一个实例,你会注意到很多额外的东西。要隐藏这些内容并将其简化为真正有趣的信息,您可以使用get属性。使用选项plain:true调用它只会返回一个实例的值。Person.create({name:'Rambow',firstname:'John'}).then(john=>{console.log(john.get({plain:true}))})//结果://{name:'Rambow',//firstname:'John',//id:1,//createdAt:Tue,01May201219:12:16GMT,//updatedAt:Tue,01May201219:12:16GMT//}提示:您还可以使用JSON.stringify(instance)将实例转换为JSON。本质上与值返回的相同。重新加载实例如果需要使实例同步,可以使用reload方法。它将从数据库中获取当前数据并覆盖调用该方法的模型的属性。Person.findOne({where:{name:'john'}}).then(person=>{person.name='jane'console.log(person.name)//'jane'person.reload().then(()=>{console.log(person.name)//'john'})})增量要在没有并发问题的情况下增加实例的值,您可以使用增量。首先,您定义一个字段和要添加的值。User.findById(1).then(user=>{returnuser.increment('my-integer-field',{by:2})}).then(/*...*/)然后,你可以定义要添加到它们的多个字段和值。User.findById(1).then(user=>{returnuser.increment(['my-integer-field','my-very-other-field'],{by:2})}).then(/*...*/)最后,您可以定义一个包含字段及其增量值的对象。User.findById(1).then(user=>{returnuser.increment({'my-integer-field':2,'my-very-other-field':3})}).then(/*...*/)decrement要在不遇到并发问题的情况下减少实例的值,您可以使用decrement。首先,您定义一个字段和要添加的值。User.findById(1).then(user=>{returnuser.decrement('my-integer-field',{by:2})}).then(/*...*/)然后,你可以定义要添加到它们的多个字段和值。User.findById(1).then(user=>{returnuser.decrement(['my-integer-field','my-very-other-field'],{by:2})}).then(/*...*/)最后,您可以定义一个包含字段及其递减值的对象。User.findById(1).then(user=>{returnuser.decrement({'my-integer-field':2,'my-very-other-field':3})}).then(/*...*/)如果本文对您有帮助,请在下方点赞或starGitHub:sequelize-docs-Zh-CN支持,谢谢。
