本文将分享为什么Python的SQLite3不会更新的详细内容,此外,我们还将为大家带来关于Angular11不会更新UI、dbContext不会更新、findOneAndUpdate不会更新,除非我
本文将分享为什么 Python 的 SQLite3 不会更新的详细内容,此外,我们还将为大家带来关于Angular 11 不会更新 UI、dbContext 不会更新、findOneAndUpdate 不会更新,除非我调用“.then()”为什么?、getter 不会更新 Vuex 中的值的相关知识,希望对你有所帮助。
本文目录一览:- 为什么 Python 的 SQLite3 不会更新
- Angular 11 不会更新 UI
- dbContext 不会更新
- findOneAndUpdate 不会更新,除非我调用“.then()”为什么?
- getter 不会更新 Vuex 中的值
为什么 Python 的 SQLite3 不会更新
如何解决为什么 Python 的 SQLite3 不会更新
这很早就奏效了,我的一些行有有效的条目,但很多都没有...
def setLength(vid,seconds):
db_conn.execute("UPDATE Videos SET length= ''" + str(seconds//1) + "'' WHERE ID=''"+str(vid)+"'';")
db_conn.commit()
result = my_cursor.execute("SELECT length,title FROM Videos WHERE ID = " + "''" + str(vid) + "'';")
for row in result:
print(vid,row[0])
print("gets here")
给出输出:
gets here
即使我使用有效 ID 运行它。
编辑:我可以使用相同的 ID 从该行获取标题列,但尝试更新长度列只会使单元格为空。
解决方法
可能非常具体,但没有更新的原因是因为在插入表时,某些 ID 已转换为科学记数法。那些会找到他们的标题,因为我用于标题搜索的功能对此很敏感。我的错。
ID | 标题 | 文件名 | 长度 |
---|---|---|---|
1.72986707541665e+ | 无题 | 253c95c4b27116e.mp | 无 |
263857279641976794 | ShowIWanttoWatchEp | 视频/ShowIWantto | 1144.0 |
185690842836020994 | ShowIWanttoWatchEp | 视频/ShowIWantto | 1174.0 |
1.7317732968119e+6 | 无题 | 9231941.m4v | 无 |
212666122173993805 | ShowIWanttoWatchEp | 视频/ShowIWantto | 995.0 |
1.69406306986304e+ | 无题 | hls-1.mp4 | 无 |
877482402128334556 | ShowIWanttoWatchEp | 视频/ShowIWantto | 1214.0 |
Angular 11 不会更新 UI
如何解决Angular 11 不会更新 UI
我的一个 Angular 11 组件不会更新 UI,我不知道为什么或我的错误发生在哪里。据我所知,我之前做了 1000 次,但是...
方法 identify()
由单击按钮触发。它通过 REST-API 从服务器加载两个非常大的对象列表。 REST-API 调用经过测试并按预期工作。加载列表中的元素相互比较,计数器 precessed
增加。
控制台输出工作正常,但 UI 未更新。我还尝试了 ApplicationRef.tick()
和所有其他方法来强制更新或 UI。没有任何效果。
只有在 foreach
循环结束后才会将输出写入 UI。
长话短篇:这是简化的代码片段:
服务
loadPrebenSkaters(): Observable<PrebenSkater[]> {
return this.restService.get(''/preben/skaters/preben/all'').pipe(map((response: any) => response.map((item: any) => new PrebenSkater(item))));
}
loadSsnSkaters(): Observable<SsnSkater[]> {
return this.restService.get(''/preben/skaters/ssn/all/'').pipe(map((response: any) => response.map((item: any) => new SsnSkater(item))));
}
组件
identify() {
this.service.loadPrebenSkaters().subscribe((prebenList: PrebenSkater[]) => {
this.service.loadSsnSkaters().subscribe((ssnlist: SsnSkater[]) => {
ssnlist.forEach((ssn: SsnSkater) => {
let found: string[] = prebenList.filter(preben => ...).map(item => item.fullname);
if (found.length) {
ssn.uuid = found;
this.processed++;
} else {
this.processed++;
}
if (this.processed % 10 == 0) {
console.log(this.processed);
}
this.changeDetectorRef.detectChanges();
});
});
});
}
HTML
<button (click)="identify()">Global Identify</button>
<span class="pr-4">Identified: {{ processed }}</span>
有什么我看不到的错误吗?
dbContext 不会更新
如何解决dbContext 不会更新
我有一个命令类作为 CQRS 工作流的一部分。它插入并更新几个不同的表,如下所示:
public class ClassName : IBusinessCommand<CommandRequest,CommandResult>
private readonly DatabaseContext _dbContext;
public ClassName(DatabaseContext dbContext)
{
_dbContext = dbContext;
}
public async Task<CommandResult> ExecuteAsync(CommandRequest request,CancellationToken token)
{
var user = _dbContext.Users.NoTracking()
.Where(x => x.request.UserId);
if (user != null)
{
var class = new Class
{
ClassID = 1,UserID = user.UserID,CreateDate = _clock.UtcNow
}
_dbContext.Classes.Add(class);
}
var seat = await FunctionThatGetsSeatRecord(token);
seat.ModifyDate = _clock.UtcNow;
seat.SeatsUsed++;
seat.SeatsRemaining--
return CommandResult.WithSuccess();
}
我们有一个名为 CommandRunner 的基类(用于我们所有这样的命令)。在这个基类中,它调用 ExecuteAsync 函数(对于传入的任何类型参数),如下所示:
var command = _container.Resolve<IBusinessCommand<TData,TResult>>(
new TypedParameter(typeof(IHoneyBeeDbContext),dbContext));
var result = await command.ExecuteAsync(data,token);
await dbContext.SaveChangesAsync();
transaction.Commit();
以便对该命令 dbContext 所做的所有更改都作为单个事务保存和提交。 一段时间以来,我们已经为 CQRS 部署了相同的基础设施,并且运行良好。上面的类以前在一个不同的服务类中,我决定将它转换为我们的 CQRS 流,所以我将它变成了一个命令。 由于我无法弄清楚的原因(我已经考虑了几个小时),我可以将创建的类正确添加到数据库中,但是我无法更新座位记录。我已经调试了整个类,并在整个流程中跟踪并检查了 _dbContext 变量,并且更新在那里正确显示,但是当它被保存和提交时,它不会更新该变量的数据库(但它会为类更新) )。 有没有人看到这里有什么问题?
解决方法
您指出返回座位的函数使用 NoTracking()(AsNoTracking() 的错别字?),这会关闭更改跟踪,因此 EF 对您对座位所做的更改视而不见。
不要对您计划查询、更新和保存实体的集合使用“无跟踪”
(在某些 EF 版本或情况下使用它可能根本不会带来任何好处,请参阅 https://github.com/dotnet/efcore/issues/14366)
未跟踪实体的详细信息:What difference does .AsNoTracking() make?
findOneAndUpdate 不会更新,除非我调用“.then()”为什么?
如何解决findOneAndUpdate 不会更新,除非我调用“.then()”为什么?
除非我使用 findOneAndUpdate
处理返回的 promise,否则我终生无法弄清楚为什么我对 .then()
的调用没有更新任何内容。我不在乎调用返回什么,所以我不费心去处理承诺。
这不起作用:
MyModel.findOneAndUpdate({key: ''XXXXX''},{$set: {status: ''complete''}})
这有效:
MyModel.findOneAndUpdate({key: ''XXXXX''},{$set: {status: ''complete''}}).then()
在末尾附加 .then()
肯定不会以任何方式伤害我,但我只是好奇为什么没有它调用就不能工作。它不应该仍然执行查询吗?
这家伙似乎在问同样的问题,但至今仍未解决:Why does MongoDB not update unless I call ".then res.json(...)" after findOneAndUpdate?
解决方法
原因是:"The query executes if callback is passed else a Query object is returned."
.then() 执行函数here
例如,下面的代码将执行 3 个 updateMany() 调用,一个 因为回调,还有两个是因为 .then() 被调用了两次。
const q = MyModel.updateMany({},{ isDeleted: true },function() {
console.log(''Update 1'');
});
q.then(() => console.log(''Update 2''));
q.then(() => console.log(''Update 3''));
getter 不会更新 Vuex 中的值
如何解决getter 不会更新 Vuex 中的值
我不明白 Vuex 中的 getter 是如何工作的。 问题是在 state 和 localStorage 中注销令牌时变空,但在 getter 中不是。 在 public class test { private static WebDriver driver; private static JavascriptExecutor js; private static Actions action; private String COLLECTION = "TestCollection"; @BeforeClass public static void init() { System.setProperty("webdriver.chrome.driver","/Users/michaelionia/Downloads/chromedriver"); ChromeOptions opt = new ChromeOptions(); opt.setExperimentalOption("debuggerAddress","localhost:9222 "); driver = new ChromeDriver(opt); js = (JavascriptExecutor) driver; action = new Actions(driver); driver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS); driver.get("https://www.pexels.com/search/videos/skyline/?orientation=landscape&size=large"); } @Test public void openbrowser() { for (int j = 1; j < 200; j++) { for (int i = 1; i < 4; i++) { try { WebElement preview = driver.findElement(By.xpath("/html/body/div[1]/div[4]/div[6]/div[1]/div[" + i + "]/div[" + j + "]/article")); js.executeScript("arguments[0].scrollIntoView()",preview); new webdriverwait(driver,3).until(ExpectedConditions.elementToBeClickable(preview)).click(); WebElement collectButton = driver.findElement(By.xpath("//*[@id=\\"photo-page-top\\"]/div/div[2]/div/div/button[2]")); new webdriverwait(driver,3).until(ExpectedConditions.elementToBeClickable(collectButton)).click(); for (int k = 1; k < 200; k++) { if (driver.findElement(By.xpath("/html/body/div[2]/div/div/ul/li[" + k + "]")).getText().equals(COLLECTION)) { try { WebElement collection = driver.findElement(By.xpath("/html/body/div[2]/div/div/ul/li[" + k + "]")); collection.click(); driver.findElement(By.xpath("/html/body/div[2]")).sendKeys(Keys.ESCAPE); new webdriverwait(driver,3).until(ExpectedConditions.elementToBeClickable(driver.findElement(By.xpath("//*[@id=\\"photo-modal\\"]/div[2]/button")))).click(); } catch (ElementClickInterceptedException e) { continue; } break; } } } catch (NoSuchElementException e) { continue; } } } } }
中,我称之为:
created
并且 created: async function () { if (this.$store.getters.shortToken) { this.isConfirm = true } console.log( ''signining'',localStorage.getItem(''token''),// '''' ''state'',this.$store.state.user.token,// '''' ''getter'',this.$store.getters.token // ''old-token'' ) if (this.$store.getters.token) { await this.$router.push({ path: ''/'' }) } }
有:
getters
还有token: state => { return localStorage.getItem(''token'') || state.user.token }
:
mutation
但是,创建的控制台登录给了我空的 localStorage 令牌(这是正常的)和空的 state.token(这也是正常的)。但是,getters.token 给了我令牌(这不正常),因为我给了SET_TOKEN 空令牌。为什么会这样?
PS。如果我在 getters 标记中的 SET_TOKEN: (state,payload) => { localStorage.setItem(''token'',payload.token) Object.assign(state,payload) }
上方添加 console.log(state.user.token,localStorage.getItem(''token''))
,那么 return
钩子中的 getters.token
是空的... 为什么?
在这种情况下也有一些使用代码,这是注销方法:
created
操作注销
methods: {
async logout () {
if (await this.$store.dispatch(''logout'')) {
console.log(''logged out'')
await this.$router.push({ path: ''/signin'' })
}
}
}
解决方法
Getter 旨在根据 derived state
计算 store state
。
您面临这个问题是因为您从 localStorage.getItem()
返回 Getter
的值,它不是 store state
的值,因此它不是 reactive
也不observable
。
在您的示例中,当您调用 localStorage.setItem()
时,Vuex 不会重新计算 Getter 的值。
仅在更改 state.user.token
时才会重新计算 Getter 的值。
因此,如果您想让 Getter 正常工作,只需返回 state.user.token
的值。
您还可以在您的 created
中添加一个 App.vue
钩子,它会检查 localStorage 中是否有令牌并调用 SET_TOKEN
突变,如果这是您试图通过调用来完成的localStorage.getItem
在您的 Getter 中:
App.vue
<script>
created() {
const token = localStorage.getItem(''token'');
if (token != null) {
this.$store.mutations.SET_TOKEN({ token });
}
}
</script>
尽管如此,在使用 Object.assign
时要注意 change detection caveats,因为 Vuex mutations follow Vue''s reactivity rules。
在您的突变中,您可能应该这样做:
SET_TOKEN: (state,payload) => {
localStorage.setItem(''token'',payload.token);
state.token = payload.token;
}
或者如果 payload
实际上是 state.user
你可以这样做:
SET_TOKEN: (state,payload.token);
state.user = {
...payload
}
}
今天关于为什么 Python 的 SQLite3 不会更新的介绍到此结束,谢谢您的阅读,有关Angular 11 不会更新 UI、dbContext 不会更新、findOneAndUpdate 不会更新,除非我调用“.then()”为什么?、getter 不会更新 Vuex 中的值等更多相关知识的信息可以在本站进行查询。
本文标签: