![](/img/trans.png)
[英]Missing DatabaseClient in Postgres spring boot R2dbc application
[英]Spring R2DBC DatabaseClient execute custom delete query in PostgreSQL
您好我正在嘗試通過他的 id 從 Postgres 數據庫中的表中刪除用戶。 我使用 Spring 和 R2DBC 並嘗試將DatabaseClient.execute("sqlCommand")
用於我的自定義刪除查詢:
import org.springframework.data.r2dbc.core.DatabaseClient;
@Service
@Transactional
public class CustomSqlService {
private final DatabaseClient databaseClient;
public Mono<Void> deleteWithCustomSql(String sql) {
databaseClient.execute(sql)
return Mono.empty();
}
其中sql
是"DELETE FROM user_table WHERE user_id = 1;"
Controller中的方法:
@RestController
@RequestMapping("postgres/")
@Timed
public class PostgresController {
// omitted code
@DeleteMapping(path = "/delete_user/{userId}")
public Mono<Void> deleteUser(@PathVariable("userId") Long userId) {
return customSqlService.deleteWithCustomSql("DELETE FROM user_table WHERE user_id = " + userId);
}
但是當我測試它時,命令不起作用。 當我調試時,我可以看到.execute()
的結果中有MonoOnResumeError
。
我有其他方法以相同的方式執行insert
和select
語句,它們運行良好。
我對它的測試:
@Test
void shouldDeleteDataFromTable() {
User user = User.builder()
.userId(1L)
.sessionId(2L)
.timestamp(10L)
.build();
webTestClient
.post()
.uri("/postgres/save_user")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.body(Mono.just(user), User.class)
.exchange()
.expectStatus().isOk()
webTestClient
.delete()
.uri("/postgres/delete_user/1")
.exchange()
.expectStatus()
.isOk();
userRepository.findAll().take(1).as(StepVerifier::create)
.expectNextCount(0)
.verifyComplete();
如何在 PostgreSQL 中正確使用databaseClient.execute()
進行自定義刪除查詢?
希望您使用的是最新的 R2dbc 1.0 和 Spring Data R2dbc(由 Spring Boot 3.0 管理)。
您的方法deleteWithCustomSql
不起作用。 沒有對databaseCLient.exectue
的訂閱,永遠不會執行 sql 並返回結果。
嘗試改成如下,把sql移到這里,使用bind
給sql綁定一個參數。
public Mono<Long> deleteByUserId(Long userId) {
return databaseClient.sql("DELETE FROM user_table WHERE user_id = :userId")
.bind("userId", userId)
.fetch()
.rowsUpdated();
}
在controller,改成如下。
@DeleteMapping(path = "/users/{userId}")
public Mono<ResponseEntity> deleteUser(@PathVariable("userId") Long userId) {
return customSqlService.deleteByUserId(userId)
.map(deleted -> {
if(deleted>0) return noContent().build();
else return notFound().build();
});
}
查看我的delete
操作的工作示例,它演示了如何在 sql 中綁定參數,它基於最新的 Spring Data R2dbc/Postgres。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.