我正在尝试使用Entity Framework批量更新记录.我试过Entity Framework.Extensions Update
方法.
该Update
方法能够使用相同的更新值集批量更新一组记录.
例:
Id - Quantity
Record 1 - A - 10
Record 2 - B - 20
Record 3 - C - 30
Run Code Online (Sandbox Code Playgroud)
我们可以通过简单的调用批量更新所有上述记录
Records.Update(new => Record { Quantity = 100 });
Run Code Online (Sandbox Code Playgroud)
如何使用Entityframework.Extensions
或以任何其他方法批量更新具有不同数量的每条记录,从而更快地完成批量更新?
c# linq entity-framework entity-framework-extended bulkupdate
我有一个Table Valued Constructor
通过它选择周围的1 million
记录.它将用于update
另一个表.
SELECT *
FROM (VALUES (100,200,300),
(100,200,300),
(100,200,300),
(100,200,300),
.....
..... --1 million records
(100,200,300)) tc (proj_d, period_sid, val)
Run Code Online (Sandbox Code Playgroud)
这是我的原始查询:https://www.dropbox.com/s/ezomt80hsh36gws/TVC.txt?dl = 0#
当我执行上述操作时,select
它只是显示查询已完成但出现错误并显示任何错误消息.
更新:尝试使用TRY/CATCH
块捕获错误消息或错误号但不使用与先前映像相同的错误
BEGIN try
SELECT *
FROM (VALUES (100,200,300),
(100,200,300),
(100,200,300),
(100,200,300),
.....
..... --1 million records
(100,200,300)) tc (proj_d, period_sid, val)
END try
BEGIN catch
SELECT Error_number(),
Error_message()
END catch
Run Code Online (Sandbox Code Playgroud)
为什么它没有执行是否有表Valed构造函数的限制Select
.我知道Insert
它是1000
,但我选择在这里.
我有一个相同集合的对象/域列表,如果 Mongodb 数据库中不存在,则应将其插入,否则应按 更新现有记录过滤器_id
。
虽然这可以使用 Spring data MongoRepositories 来完成,但它似乎是:
DuplicateKeyException
,它会终止执行(不保存下一条记录,尽管我想忽略此类异常)现在,如果我使用BulkOperations bulkOps = mongoTemplate.bulkOps(BulkMode.UNORDERED, collectionName)
,如果完整性破坏,它仍然会抛出相同的异常!尽管根据 Spring 文档,使用BulkMode.UNORDERED
:
并行执行批量操作。出现错误时,处理将继续。
考虑下面的代码:
BulkOperations bulkOps = mongoTemplate.bulkOps(BulkMode.UNORDERED, className);
for (T entry : entries) {
DBObject dbDoc = new BasicDBObject();
mongoTemplate.getConverter().write(entry, dbDoc);
Update update = Update.fromDBObject(dbDoc);
bulkOps.updateOne(new Query(Criteria.where("_id").is(dbDoc.get("_id"))), update);
}
BulkWriteResult result = bulkOps.execute();
Run Code Online (Sandbox Code Playgroud)
当我执行上面的代码时,出现以下异常:
java.lang.IllegalArgumentException: Invalid BSON field name _class
at org.bson.AbstractBsonWriter.writeName(AbstractBsonWriter.java:516)
at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:129)
at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:61)
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)
at com.mongodb.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:85)
at com.mongodb.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:43)
at …
Run Code Online (Sandbox Code Playgroud) 我试图在PostgreSQL中实现一些非常简单的Rails方式.
假设你有一个User
3列模型id
,cached_segment
,cached_step
.假设您已经有一个复杂的查询,它可以计算segment
并动态地query
封装在一个范围内User.decorate_with_segment_and_step
.这将返回一个ActiveRecord
关系,User
与之相同,但增加了3个列:
id cached_segment cached_step segment step cache_invalid
1 NULL NULL segment_1 step_1 TRUE
2 segment_1 step_2 segment_1 step_2 FALSE
3 ...
Run Code Online (Sandbox Code Playgroud)
我想生成的SQL是以下(PostgreSQL风格):
UPDATE users
SET cached_segment = segment_1
cached_step = step
FROM (#{User.decorate_with_segment_and_step.to_sql}) decorated_users
WHERE decorated_users.cache_invalid AND decorated_users.id = users.id
Run Code Online (Sandbox Code Playgroud)
理想情况下,我可以做类似的事情
User.
from(User.decorate_with_segment_and_step, 'decorated_users').
where(cache_invalid: true).
update_all('cached_segment = segment, cached_step = step')
Run Code Online (Sandbox Code Playgroud)
我对上面的语句没有好运update_all
,根据源代码,只是from
在构建update语句时丢弃该子句.
注意:我知道我可以使用User.connection.execute(my_raw_sql_here)
,这就是我现在正在做的事情.目标是坚持使用ActiveRecord.
对于以下命令, wherequery
只能匹配一个文档(请注意,bulkWrite()
默认情况下是有序的):
final BulkWriteResult res = db.getCollection("mycol").bulkWrite(Arrays.asList(
new UpdateOneModel<>(query,
new Document("$addToSet", new Document("some_things", things))),
new UpdateOneModel<>(query,
new Document("$pull", new Document("some_things", otherthings)))));
Run Code Online (Sandbox Code Playgroud)
...我知道如果第一次更新成功而第二次失败(在正常情况下应该是不可能的),第一次更新仍将应用于文档,这意味着批量写入不是严格原子的。但是,假设两个查询都成功,操作是原子的吗?例如,其他写入是否可以在两个操作之间交错?
如何通过 typeorm 中的原始查询进行批量更新?
例如,我们有一个带有属性名称的模型User
如何在一次事务中更改少数用户的名称?
typeorm 版本:0.2.7
数据库:postgress
我知道 Sequelize Sequelize doc不支持 postgresQL 的 updateOnDuplicate ,那么有解决这个问题的方法吗?
可以通过“SQL命令”来实现吗?
我有一个拥有超过 100 万用户的集合,我正在尝试更新某些事件的用户余额。
当我尝试更新例如 299 行时,它最多需要 15739.901 毫秒
服务器上没有高负载,它只是运行 mongo。我将数据库存储在 SSD Samsung evo 860 上,但 MongoDB 安装在 HDD 上。
这是我的功能:
async usersUpdate(usersToUpdate){
const updates = [];
return new Promise(async (resolve, reject) => {
users.forEach(user=>{
updates.push(
{ "updateOne": {
"filter": { "userID": user.userID, 'balance':user.userBalance },
"update": { "$set": { "user.$.userBalance": user.newBalance } , "$addToSet":{'orders.$.orderID':user.OrderID} }
}
});
}
console.log('total updates' , updates.length);
if (updates.length > 0){
const DbConnection = await getConnection();
const usersTable = DbConnection.collection('usersCollection');
transactionsTable.bulkWrite(updates, {"ordered": false, writeConcern : { …
Run Code Online (Sandbox Code Playgroud) 我想做类似的事情,并将其中具有“Paris”的myTable.update({ location: 'Paris'}, { location: '' }
所有对象更改为设置为空字符串。myTable
location
location
location
不是主键,因此在执行命令之前可以有任意数量的myTable
具有= 'Paris' 的对象,但在执行命令之后location
不应有= 'Paris' 的对象。location
我有 SQL 背景,所以这似乎是一个非常简单、基本的数据库函数。但Table.update() 的 Dexie 文档表明它只支持使用主键,因此最多只能更新一个对象。当然,除了循环多次调用来更新数据库之外,还有其他方法可以做到这一点吗?一些我没见过的命令?或者我是否无法理解一些我应该了解的 NoSql 数据库?
我正在使用 Django 2.2 并且我有一个模型auto_now
modification_datetime
字段的模型,我需要在bulk_update
执行期间/之后仅针对真正更新的受影响的注册表进行更新。
是否可以auto_now
通过执行仅更新受影响记录上的日期时间模型字段bulk_update
?
bulkupdate ×10
mongodb ×3
node.js ×3
atomic ×1
atomicity ×1
bulkinsert ×1
c# ×1
dexie ×1
django ×1
indexeddb ×1
interleave ×1
linq ×1
performance ×1
postgresql ×1
sequelize.js ×1
spring ×1
spring-boot ×1
sql ×1
sql-server ×1
typeorm ×1
updates ×1