我正在使用NodeJS,express,express-resource和Sequelize创建一个RESTful API,用于管理存储在MySQL数据库中的数据集。
我正试图弄清楚如何使用Sequelize正确更新记录。
我创建了一个模型:
module.exports = function (sequelize, DataTypes) {
return sequelize.define('Locale', {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
locale: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
validate: {
len: 2
}
},
visible: {
type: DataTypes.BOOLEAN,
defaultValue: 1
}
})
}
然后,在我的资源控制器中,我定义了一个更新操作。
在这里,我希望能够更新id与req.params
变量匹配的记录。
首先,我构建一个模型,然后使用updateAttributes
方法更新记录。
const Sequelize = require('sequelize')
const { dbconfig } = require('../config.js')
// Initialize database connection
const sequelize = new Sequelize(dbconfig.database, dbconfig.username, dbconfig.password)
// Locale model
const Locales = sequelize.import(__dirname + './models/Locale')
// Create schema if necessary
Locales.sync()
/**
* PUT /locale/:id
*/
exports.update = function (req, res) {
if (req.body.name) {
const loc = Locales.build()
loc.updateAttributes({
locale: req.body.name
})
.on('success', id => {
res.json({
success: true
}, 200)
})
.on('failure', error => {
throw new Error(error)
})
}
else
throw new Error('Data not provided')
}
现在,这实际上并没有像我期望的那样产生更新查询。
而是执行插入查询:
INSERT INTO `Locales`(`id`, `locale`, `createdAt`, `updatedAt`, `visible`)
VALUES ('1', 'us', '2011-11-16 05:26:09', '2011-11-16 05:26:15', 1)
所以我的问题是:使用Sequelize ORM更新记录的正确方法是什么?
答案 0 :(得分:162)
从版本2.0.0开始,您需要将 where 子句包装在where
属性中:
Project.update(
{ title: 'a very different title now' },
{ where: { _id: 1 } }
)
.success(result =>
handleResult(result)
)
.error(err =>
handleError(err)
)
最新版本实际上不再使用success
和error
,而是使用then
- 有能力的承诺。
所以上面的代码如下:
Project.update(
{ title: 'a very different title now' },
{ where: { _id: 1 } }
)
.then(result =>
handleResult(result)
)
.catch(err =>
handleError(err)
)
答案 1 :(得分:80)
我没有使用Sequelize,但在阅读完文档之后,很明显你是instantiating a new object,这就是Sequelize在数据库中插入新记录的原因。< / p>
首先,您需要搜索该记录,获取该记录,然后才更改其属性并update,例如:
Project.find({ where: { title: 'aProject' } })
.on('success', function (project) {
// Check if record exists in db
if (project) {
project.update({
title: 'a very different title now'
})
.success(function () {})
}
})
答案 2 :(得分:28)
自sequelize v1.7.0起,您现在可以在模型上调用update()方法。更清洁
例如:
Project.update(
// Set Attribute values
{ title:'a very different title now' },
// Where clause / criteria
{ _id : 1 }
).success(function() {
console.log("Project with id =1 updated successfully!");
}).error(function(err) {
console.log("Project update failed !");
//handle error here
});
答案 3 :(得分:23)
2020年1月答案
要了解的是,模型有一个更新方法,而实例(记录)有一个单独的更新方法。 DEBUG: Unicodising 'mb' using UTF-8
DEBUG: Unicodising 's3://testbucket' using UTF-8
DEBUG: Command: mb
DEBUG: CreateRequest: resource[uri]=/
DEBUG: Using signature v2
DEBUG: SignHeaders: u'PUT\n\n\n\nx-amz-date:Wed, 15 Jan 2020 02:28:25 +0000\n/testbucket/'
DEBUG: Processing request, please wait...
DEBUG: get_hostname(testbucket): 192.168.178.50:7480
DEBUG: ConnMan.get(): creating new connection: http://192.168.178.50:7480
DEBUG: non-proxied HTTPConnection(192.168.178.50, 7480)
DEBUG: Response:
DEBUG: Unicodising './s3cmd' using UTF-8
DEBUG: Unicodising '--debug' using UTF-8
DEBUG: Unicodising 'mb' using UTF-8
DEBUG: Unicodising 's3://testbucket' using UTF-8
Invoked as: ./s3cmd --debug mb s3://testbucket
Problem: error: [Errno 111] Connection refused
S3cmd: 2.0.2
python: 2.7.17 (default, Oct 19 2019, 23:36:22)
[GCC 9.2.1 20190909]
environment LANG=en_GB.UTF-8
Traceback (most recent call last):
File "./s3cmd", line 3092, in <module>
rc = main()
File "./s3cmd", line 3001, in main
rc = cmd_func(args)
File "./s3cmd", line 237, in cmd_bucket_create
response = s3.bucket_create(uri.bucket(), cfg.bucket_location)
File "/home/cephuser/s3cmd-2.0.2/S3/S3.py", line 398, in bucket_create
response = self.send_request(request)
File "/home/cephuser/s3cmd-2.0.2/S3/S3.py", line 1258, in send_request
conn = ConnMan.get(self.get_hostname(resource['bucket']))
File "/home/cephuser/s3cmd-2.0.2/S3/ConnMan.py", line 253, in get
conn.c.connect()
File "/usr/lib/python2.7/httplib.py", line 831, in connect
self.timeout, self.source_address)
File "/usr/lib/python2.7/socket.py", line 575, in create_connection
raise err
error: [Errno 111] Connection refused
更新所有匹配的记录并返回数组see Sequelize documentation。 Model.update()
更新记录并返回一个实例对象。
因此,要针对每个问题更新一条记录,代码将如下所示:
Instance.update()
因此,使用SequlizeModel.findOne({where: {id: 'some-id'}})
.then(record => {
if (!record) {
throw new Error('No record found')
}
console.log(`retrieved record ${JSON.stringify(record,null,2)}`)
let values = {
registered : true,
email: 'some@email.com',
name: 'Joe Blogs'
}
record.update(values).then( updatedRecord => {
console.log(`updated record ${JSON.stringify(updatedRecord,null,2)}`)
// login into your DB and confirm update
})
})
.catch((error) => {
// do seomthing with the error
throw new Error(error)
})
或Model.findOne()
获取单个实例(记录)的句柄,然后使用Model.findByPkId()
答案 4 :(得分:15)
对于在2018年12月寻找答案的人来说,这是使用promises的正确语法:
Project.update(
// Values to update
{
title: 'a very different title now'
},
{ // Clause
where:
{
id: 1
}
}
).then(count => {
console.log('Rows updated ' + count);
});
答案 5 :(得分:9)
我认为使用UPDATE ... WHERE
解释here和here是一种精益方法
Project.update(
{ title: 'a very different title no' } /* set attributes' value */,
{ where: { _id : 1 }} /* where criteria */
).then(function(affectedRows) {
Project.findAll().then(function(Projects) {
console.log(Projects)
})
答案 6 :(得分:5)
此解决方案已弃用
失败|失败|错误()已弃用,请在2.1中删除 改为使用promise-style。
所以你必须使用
Project.update(
// Set Attribute values
{
title: 'a very different title now'
},
// Where clause / criteria
{
_id: 1
}
).then(function() {
console.log("Project with id =1 updated successfully!");
}).catch(function(e) {
console.log("Project update failed !");
})
您也可以使用
.complete()
此致
答案 7 :(得分:2)
有两种方法可以按顺序更新记录。
首先,如果您具有唯一的标识符,则可以使用where子句,否则,如果要更新具有相同标识符的多个记录。
您可以创建要更新的整个对象或特定列
const objectToUpdate = {
title: 'Hello World',
description: 'Hello World'
}
models.Locale.update(objectToUpdate, { where: { id: 2}})
仅更新特定列
models.Locale.update({ title: 'Hello World'}, { where: { id: 2}})
第二,您可以使用查找查询来查找它,并使用设置和保存功能来更新数据库。
const objectToUpdate = {
title: 'Hello World',
description: 'Hello World'
}
models.Locale.findAll({ where: { title: 'Hello World'}}).then((result) => {
if(result){
// Result is array because we have used findAll. We can use findOne as well if you want one row and update that.
result[0].set(objectToUpdate);
result[0].save(); // This is a promise
}
})
在更新或创建新行时始终使用事务。这样,如果有任何错误或进行了多个更新,它将回滚所有更新:
models.sequelize.transaction((tx) => {
models.Locale.update(objectToUpdate, { transaction: t, where: {id: 2}});
})
答案 8 :(得分:1)
我使用了 update 方法来更新我的记录。
models.users.update(
{
"name":'sam',
"city":'USA'
},
where:{
id:1
}
)
答案 9 :(得分:1)
如果您在这里寻找一种增加模型中特定字段值的方法...
自sequelize@5.21.3
起,这对我有用
User.increment("field", {by: 1, where: {id: 1});
答案 10 :(得分:1)
hi更新记录非常简单
FROM python:3.7
# Ensure that Python outputs everything that's printed inside
# the application rather than buffering it.
ENV PYTHONUNBUFFERED 1
ENV APP_ROOT /name
# Copy in your requirements file
ADD req.txt /req.txt
# Install build deps, then run `pip install`, then remove unneeded build deps all in a single step. Correct the path to your production requirements file, if needed.
RUN pip install virtualenvwrapper
RUN python3 -m venv /venv
RUN /venv/bin/pip install -U pip
RUN /venv/bin/pip install --no-cache-dir -r /req.txt
# Copy your application code to the container (make sure you create a .dockerignore file if any large files or directories should be excluded)
RUN mkdir ${APP_ROOT}
RUN mkdir ${APP_ROOT}/static
WORKDIR ${APP_ROOT}
ADD . ${APP_ROOT}
COPY mime.types /etc/mime.types
# uWSGI will listen on this port
EXPOSE 8000
# Call collectstatic (customize the following line with the minimal environment variables needed for manage.py to run):
#RUN if [ -f manage.py ]; then /venv/bin/python manage.py collectstatic --noinput; fi
# Start uWSGI
CMD [ "/venv/bin/uwsgi", "--ini", "/fec/uwsgi.ini"]
传递参数result.feild = updatedField
V5代码
const sequelizeModel = require("../models/sequelizeModel"); const id = req.params.id; sequelizeModel.findAll(id) .then((result)=>{ result.name = updatedName; result.lastname = updatedLastname; result.price = updatedPrice; result.tele = updatedTele; return result.save() }) .then((result)=>{ console.log("the data was Updated"); }) .catch((err)=>{ console.log("Error : ",err) });
答案 11 :(得分:1)
您可以使用Model.update()方法。
使用异步/等待:
try{
const result = await Project.update(
{ title: "Updated Title" }, //what going to be updated
{ where: { id: 1 }} // where clause
)
} catch (error) {
// error handling
}
使用.then()。catch():
Project.update(
{ title: "Updated Title" }, //what going to be updated
{ where: { id: 1 }} // where clause
)
.then(result => {
// code with result
})
.catch(error => {
// error handling
})
答案 12 :(得分:1)
在现代javascript Es6中使用异步并等待
const title = "title goes here";
const id = 1;
try{
const result = await Project.update(
{ title },
{ where: { id } }
)
}.catch(err => console.log(err));
您可以返回结果...
答案 13 :(得分:1)
public static update(values:Object,options:Object): 无极&GT;
检查文档http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-update
Project.update(
// Set Attribute values
{ title:'a very different title now' },
// Where clause / criteria
{ _id : 1 }
).then(function(result) {
//it returns an array as [affectedCount, affectedRows]
})
答案 14 :(得分:0)
我在下面的代码中使用了sequelize.js
,node.js
和transaction
并添加了适当的错误处理,如果找不到数据,则会抛出错误,即找不到具有该id的数据< / p>
editLocale: async (req, res) => {
sequelize.sequelize.transaction(async (t1) => {
if (!req.body.id) {
logger.warn(error.MANDATORY_FIELDS);
return res.status(500).send(error.MANDATORY_FIELDS);
}
let id = req.body.id;
let checkLocale= await sequelize.Locale.findOne({
where: {
id : req.body.id
}
});
checkLocale = checkLocale.get();
if (checkLocale ) {
let Locale= await sequelize.Locale.update(req.body, {
where: {
id: id
}
});
let result = error.OK;
result.data = Locale;
logger.info(result);
return res.status(200).send(result);
}
else {
logger.warn(error.DATA_NOT_FOUND);
return res.status(404).send(error.DATA_NOT_FOUND);
}
}).catch(function (err) {
logger.error(err);
return res.status(500).send(error.SERVER_ERROR);
});
},
答案 15 :(得分:0)
我是这样做的:
Model.findOne({
where: {
condtions
}
}).then( j => {
return j.update({
field you want to update
}).then( r => {
return res.status(200).json({msg: 'succesfully updated'});
}).catch(e => {
return res.status(400).json({msg: 'error ' +e});
})
}).catch( e => {
return res.status(400).json({msg: 'error ' +e});
});
答案 16 :(得分:0)
如果 Model.update
语句对您不起作用,您可以这样尝试:
try{
await sequelize.query('update posts set param=:param where conditionparam=:conditionparam', {replacements: {param: 'parameter', conditionparam:'condition'}, type: QueryTypes.UPDATE})
}
catch(err){
console.log(err)
}