10.Django数据库操作(增删改)

本文详细介绍了Django框架中ORM的操作方法,包括数据的插入、更新、删除等常见操作,以及一对一、多对多关系的处理技巧。

插入数据

  命令:create 或者 save

  create用法:ModelName.objects.create(itemName="itemValue")

  save用法:modelName = ModelName()

        modelName.itemName = itemValue

        modelName.save()

  说明:create是objecet管理器(model默认管理器)的方法,save是model对象的方法

 

例子:

1.给Author表插入一条记录,其中name的值为 测试name(普通单表插入)

  方法一:Author.objects.create(name="测试name")

  方法二:author = Author()

      author.name = "测试name"
      author.save()

  说明:分别是create和save的演示

 

2.给AuthorDetail表插入一条记录,记录Author表中id为1的作者细节信息(1对1关系) 

# sex = models.BooleanField(max_length=1, choices=((0, '男'), (1, '女'),))
# email = models.EmailField()
# address = models.CharField(max_length=50)
# birthday = models.DateField()
# author = models.OneToOneField(Author)

  方法一:AuthorDetail.objects.create(

        sex=False,

        email="admin@admin.com",

        address="中国",

        birthday="1988-1-1",

        author_id=1)

  方法二:Author.objects.create(name="测试name")

      author = Author()
      author.name = "测试name"
      author.save()

      AuthorDetail.objects.create(

        sex=False,

        email="admin@admin.com",

        address="中国",

        birthday="1988-1-1",

        author=author)

  说明:对于这种1对1或者1对多的插入,可以有两种方式,第一种就是方法一中,直接用author_id=1这种,另一种是直接传递个对象,像方法二中那样,直接传autho=author框架会自己去找到对应的id存入到数据库中,在这个例子中,是使用先创建author在把这个author保存,然后传递给authorDetail的,在实际中,该author对象也有可能是直接从数据库查出来的,只要是数据库里确实有的author对象就可以

 

3.插入一条Book信息(多对多)

# title = models.CharField(max_length=100)
# authors = models.ManyToManyField(Author)
# publisher = models.ForeignKey(Publisher)
# publication_date = models.DateField()

  步骤1:插入Book表(写入Book中所有非Many-to-Many的字段)

      book = Book()
      book.title ="python学习"
      book.publisher_id ="1"
      book.publication_date ="2000-1-1"
      book.save()

  步骤2:插入Book表和Author表的关联表(处理Many-to-Many字段)

      book.authors.add(Author.objects.get(id=1))

 

修改数据

  命令:update 或者 save

例子:讲Author表中id为1的记录的name改为xiaol

  save方法:

    author = Author.objects.get(id=1)
    author.name="xiaol"
    author.save()

  update方法:

    Author.objects.filter(id=1).update(name="xiaol")

 

删除数据

  命令:delete

  用法:ModelName.objects.filter(param).delete()

  说明:默认下delete是级联删除

例子:删除Author表中id为1的数据

  Author.objects.filter(id=1).delete()

 

官方文档:https://docs.djangoproject.com/en/1.9/ref/models/querysets/

转载于:https://www.cnblogs.com/413xiaol/p/6503480.html

<think>嗯,用户想知道如何通过API实现后端数据库增删改操作。首先,我需要回忆一下常见的API设计方法,以及如何结合数据库操作。根据用户提供的引用内容,他们可能已经了解了一些关于JSP、Spring Boot、Vue、C#等方面的知识,但这次重点是API的实现。 首先,我应该分步骤解释,可能包括设计API接口、选择技术栈、具体实现步骤以及示例代码。用户提到的增删改,所以需要分别对应对应的HTTP方法:POST(增)、PUT或PATCH(改)、DELETE(删)。同时,需要确保每个步骤都清晰,并且给出代码示例,可能参考他们提到的引用中的技术,比如Spring Boot和MyBatis,或者C#的例子。 然后,用户提供的引用中有提到JDBC、MyBatis、Spring Boot和Vue的整合,所以在示例部分可能需要用Spring Boot来展示,因为这是比较流行的后端框架,而且引用中有相关内容。此外,引用3提到了前后端分离的坑,比如JSON格式和自增ID,这些需要注意的点也应该在回答中提到,避免用户踩坑。 接下来,每个操作的具体实现需要考虑参数传递、数据库连接、SQL执行和错误处理。比如,插入数据时需要用POST方法,接收JSON数据,然后通过MyBatis的Mapper映射到数据库字段,特别是当字段名和实体类属性不一致时,需要使用resultMap,如引用2所述。同时,引用4中的登录功能涉及到参数校验,这也提示在增删改操作中需要验证输入数据的有效性,避免SQL注入或空值错误。 可能还需要解释RESTful API的设计原则,确保用户了解为什么使用特定的HTTP方法和URL结构。此外,安全性方面,比如使用预处理语句防止SQL注入,这点在引用4的代码中有所体现,应该强调。 最后,生成相关问题时要围绕API实现和数据库操作,可能涉及性能优化、错误处理、身份验证等方面的问题,帮助用户进一步学习。</think>### 如何通过API实现后端数据库增删改功能 #### 一、实现原理与步骤 1. **API设计原则** 通过RESTful风格定义接口,使用HTTP方法对应数据库操作: - 增(`POST`):创建新数据 - 删(`DELETE`):删除指定数据 - 改(`PUT/PATCH`):更新全部或部分数据 例如:`/api/users`(用户资源路径) 2. **技术栈选择** - 后端框架:Spring Boot(Java)、Express(Node.js)、DjangoPython)等 - 数据库交互:JDBC(基础)、MyBatis/ORM框架(简化操作)[^2] - 数据格式:JSON作为请求/响应体 3. **关键实现步骤** - 定义数据模型(如`User`类) - 创建数据库连接池(如HikariCP) - 编写Mapper映射文件或Repository层 - 通过控制器(Controller)接收HTTP请求并处理 --- #### 二、具体实现示例(Spring Boot + MyBatis) ##### 1. 插入数据(POST) ```java @RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserMapper userMapper; @PostMapping public ResponseEntity<String> createUser(@RequestBody User user) { if (user.getName() == null || user.getEmail() == null) { return ResponseEntity.badRequest().body("参数缺失"); } userMapper.insert(user); // MyBatis执行INSERT语句 return ResponseEntity.ok("创建成功"); } } ``` > **注意**:需在MyBatis Mapper文件中定义`<insert>`标签,并通过`@RequestBody`接收JSON数据[^3] ##### 2. 更新数据(PUT) ```java @PutMapping("/{id}") public ResponseEntity<String> updateUser( @PathVariable Long id, @RequestBody User user ) { User existingUser = userMapper.selectById(id); if (existingUser == null) { return ResponseEntity.notFound().build(); } user.setId(id); userMapper.update(user); // 执行UPDATE语句 return ResponseEntity.ok("更新成功"); } ``` > **关键点**:需验证ID是否存在,避免无效更新[^4] ##### 3. 删除数据(DELETE) ```java @DeleteMapping("/{id}") public ResponseEntity<String> deleteUser(@PathVariable Long id) { int affectedRows = userMapper.deleteById(id); return affectedRows > 0 ? ResponseEntity.ok("删除成功") : ResponseEntity.notFound().build(); } ``` > **安全建议**:生产环境应增加权限验证(如JWT鉴权) --- #### 三、常见问题与优化 1. **参数校验** 使用`@Valid`注解配合Hibernate Validator实现字段验证: ```java @PostMapping public ResponseEntity<?> createUser(@Valid @RequestBody User user) { // 自动验证@NotBlank等注解 } ``` 2. **事务管理** 添加`@Transactional`保证操作的原子性: ```java @Transactional public void batchUpdate(List<User> users) { users.forEach(userMapper::update); } ``` 3. **防止SQL注入** - 必须使用预编译语句(MyBatis默认支持) - 禁止直接拼接SQL参数[^4] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值