【python】flask中ORM工具SQLAIchemy,各种数据查询操作详细解析

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,面试宝典等分享。

所属的专栏:flask框架零基础,进阶应用实战教学
景天的主页:景天科技苑

文章目录

  • 基本查询
    • SQLAlchemy常用的查询过滤器
    • get():参数为主键,表示根据主键查询数据,如果主键不存在返回None
    • all()返回查询到的所有对象
    • count() 返回查询结果的数量
    • first()返回查询到的第一个对象
  • filter条件查询
    • 基于filter进行模糊查询
    • 基于filter进行比较查询
    • filter_by精确条件查询
  • 逻辑查询
    • 逻辑与,需要导入`and_`,返回`and_()`条件满足的所有数据
    • 逻辑或,需要导入or_
    • 逻辑非,返回名字不等于"小白"的所有数据
    • not_ 相当于取反
    • in_范围查询
    • is_判断值查询
    • order_by 排序
    • 对查询结果进行偏移量和数量的限制
  • 总结

Hello,大家好,我是景天,前面我们讲到flask的ORM工具的增删改,其实工作中,我们用的较多的还是数据的查询,今天我们就SQLAIchemy的各种查询方式来详细展开!!!

基本查询

SQLAlchemy常用的查询过滤器

filter是模糊查询,filter_by是精确查询
在这里插入图片描述

SQLAlchemy常用的查询结果方法
在这里插入图片描述

get():参数为主键,表示根据主键查询数据,如果主键不存在返回None

查询之前,先看下数据库数据
在这里插入图片描述

@app.route("/get")
def get():
    """按主键获取一条,有以下几种查询方式"""
    # student = Student.query.get({"id": 4})
    # student = Student.query.get((4,))
    # student = db.session.query(Student).get(4)
    student = Student.query.get(4)
    print(student)
    return "ok"

浏览器访问/get ,拿到数据
在这里插入图片描述

all()返回查询到的所有对象

# 如果不设置条件,则默认查询全表
student_list = Student.query.all()
print(student_list)

# 设置过滤条件查询全部结果
# 如果查不到数据,返回空列表
student_list = Student.query.filter(Student.sex==False).all()
print(student_list)

# all()的返回值是一个python列表,可以直接使用切片,与django的QuerySet完全不是一回事。
student_list = Student.query.all()[1:]
print(student_list)

在这里插入图片描述

count() 返回查询结果的数量

# 如果不设置过滤条件,则默认统计全表记录的数量
total = Student.query.count()
print(total)

# 设置条件,作为返回满足条件的记录数量
total = Student.query.filter(Student.age>16).count()
print(total)

在这里插入图片描述

first()返回查询到的第一个对象

【first的结果只有一个模型对象】

"""获取查询结果的第一个结果"""
student = Student.query.first()
print(student, student.name)

student = Student.query.filter(Student.sex==True).first()
print(student, student.name)

"""获取查询结果的第二个结果,现在不支持负索引了"""
student = Student.query.filter(Student.sex==True)[1]
print(student, student.name)

在这里插入图片描述

filter条件查询

支持各种运算符和查询方法或者模糊查询方法。

基于filter进行模糊查询

# 名字包含"黑"的学生
student_list = Student.query.filter(Student.name.contains("黑")).all()
print(student_list)

# 名字以"小"开头的学生
student_list = Student.query.filter(Student.name.startswith("小")).all()
print(student_list)

# 名字以"红"结尾的学生
student_list = Student.query.filter(Student.name.endswith("兰")).all()
print(student_list)

在这里插入图片描述

基于filter进行比较查询

# 比较查询需要指定条件格式为: filter(模型.字段 比较运算符 值)。
# 运算符可以是: ==表示相等, !=不相等,> 表示大于  < 表示小于,>=大于等于,<=小于等于
# 单个条件的比较查询
student_list = Student.query.filter(Student.age>15).all()
print(student_list)

# 多个条件的比较查询
# 要求多个条件都要满足,相当于逻辑查询中的 并且(and)!!
student_list = Student.query.filter(Student.age>15, Student.sex==True).all()
print(student_list)

在这里插入图片描述

filter_by精确条件查询

filter_by 只支持字段的值是否相等的情况,对于大于、小于、大于等于、等等其他条件是不支持的。

例如:返回age等于16的学生

# 单条件格式:filter_by(字段=值)
# 多条件格式:filter_by(字段=值, 字段=值, 字段=值...)
student_list = Student.query.filter_by(age=16).all()  # 字段添加不需要附带模型类
print(student_list)

在这里插入图片描述

逻辑查询

逻辑与,需要导入and_,返回and_()条件满足的所有数据

 # 默认情况下, 多个条件并且的情况,可以直接基于filter或者filter_by采用逗号拼接多个查询条件实现
# 查询年龄大于16的男生
student_list = Student.query.filter(Student.age>16, Student.sex==True).all()
print("第一次",student_list)

#  filter(and_(条件1,条件2,....))  等价于  filter(条件1,条件2,.....)
from sqlalchemy import and_
student_list = Student.query.filter(and_(Student.age>16, Student.sex==True)).all()
print("第二次",student_list)

在这里插入图片描述

逻辑或,需要导入or_

# # 查询年龄大于16(Student.age>16)或者钱包余额大于1500(Student.money>1500) 女生
from sqlalchemy import or_
student_list = Student.query.filter(or_(Student.age>16, Student.money>1500), Student.sex==False).all()
print("第一次",student_list)

# 查询 年龄大于16的男生(Student.age>16, Student.sex==True) 和 钱包余额大于1500的女生(Student.money>1500, Student.sex==False)
from sqlalchemy import or_, and_
student_list = Student.query.filter(
    or_(
        and_(Student.age>16, Student.sex==True),
        and_(Student.money>1500, Student.sex==False)
    )
).all()
print("第二次",student_list)

在这里插入图片描述

逻辑非,返回名字不等于"小白"的所有数据

#逻辑非
student = Student.query.filter(Student.name != '小白').all()
print(student)

在这里插入图片描述

not_ 相当于取反

from sqlalchemy import not_
student = Student.query.filter(Student.name != '小白').all()
print("第一次",student)

student = Student.query.filter(not_(Student.name == '小白')).all()
print("第二次",student)

在这里插入图片描述

in_范围查询

student_list = Student.query.filter(Student.id.in_([1,3,4,5])).all()
print(student_list)

在这里插入图片描述

is_判断值查询

# 查询邮箱为Null的用户
student_list = Student.query.filter(Student.email.is_(None)).all()
print(student_list)

"""判断是否存在"""
# 查询是否存在"小辉"这个学生
query = Student.query.filter(Student.name == "小辉").exists()
#通过scalar()拿到查询是否存在
ret = db.session.query(query).scalar()
print("第一次是否存在",ret)

student = Student.query.filter(Student.name=="小明").first()
print("第二次是否存在",bool(student))

在这里插入图片描述

order_by 排序

# 按年龄倒叙排序
student_list = Student.query.order_by(Student.age.desc()).all()
print(student_list)

# 按钱包余额进行倒序,如果余额一致,按id倒序
student_list = Student.query.order_by(Student.money.desc(), Student.id.desc()).all()
print(student_list)

在这里插入图片描述

对查询结果进行偏移量和数量的限制

#查询年龄最大的三个人
student_list = Student.query.order_by(Student.age.desc()).limit(3).all()
print(student_list)

# 查询钱包余额最少的三个人
student_list = Student.query.order_by(Student.money.asc()).limit(3).all()
print(student_list)

# 按钱包余额进行倒序排列,查询出排名在4-5之间的学生
student_list = Student.query.order_by(Student.money.desc()).offset(3).limit(2).all()
print(student_list)

student_list = Student.query.order_by(Student.money.desc()).all()[3:5]
print(student_list)

在这里插入图片描述

完整代码

from flask import Flask
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
# 连接数据库连接url
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:Jinghao31357!@10.10.0.52:3306/students?charset=utf8mb4"
# 动态追踪修改设置,如未设置只会提示警告
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
# 查询时会显示原始SQL语句
app.config["SQLALCHEMY_ECHO"] = True

# 把SQLAlchemy组件注册到项目中
db = SQLAlchemy()
db.init_app(app)


#创建模型类
class Student(db.Model):
    """学生信息模型"""

    # 声明与当前模型绑定的数据表名称
    __tablename__ = "tb_student2"
    id = db.Column(db.Integer, primary_key=True, comment="主键")
    name = db.Column(db.String(15), index=True, comment="姓名")
    age = db.Column(db.SmallInteger, comment="年龄")
    sex = db.Column(db.Boolean, default=True, comment="性别")
    email = db.Column(db.String(128), unique=True, comment="邮箱地址")
    money = db.Column(db.Numeric(10, 2), default=0.0, comment="钱包")

    def __repr__(self):  # 相当于django的__str__
        return f"{self.name}<{self.__class__.__name__}>"


class Course(db.Model):
    """课程模型"""

    __tablename__ = "tb_course"
    id = db.Column(db.Integer, primary_key=True, comment="主键")
    name = db.Column(db.String(255), unique=True, comment="课程")
    price = db.Column(db.Numeric(8, 2), comment="价格")

    def __repr__(self):  # 相当于django的__str__
        return f"{self.name}<{self.__class__.__name__}>"



class Teacher(db.Model):
    """老师模型"""
    __tablename__ = "tb_teacher"
    id = db.Column(db.Integer, primary_key=True, comment="主键")
    name = db.Column(db.String(255), unique=True, comment="姓名")
    #枚举类型
    option = db.Column(db.Enum("讲师", "助教", "班主任"), default="讲师")

    def __repr__(self):
        return f"{self.name}<{self.__class__.__name__}>"



@app.route("/get")
def get():
    """按主键获取一条,有以下几种查询方式"""
    # student = Student.query.get({"id": 4})
    # student = Student.query.get((4,))
    # student = db.session.query(Student).get(4)
    # student = Student.query.get(4)
    # print(student)

    #
    # # 如果不设置条件,则默认查询全表
    # student_list = Student.query.all()
    # print(student_list)
    #
    # # 设置过滤条件查询全部结果
    # # 如果查不到数据,返回空列表
    # student_list = Student.query.filter(Student.sex==False).all()
    # print(student_list)
    #
    # # all()的返回值是一个python列表,可以直接使用切片,与django的QuerySet完全不是一回事。
    # student_list = Student.query.all()[1:]
    # print(student_list)



    #count返回查询结果数量
    # 如果不设置过滤条件,则默认统计全表记录的数量
    # total = Student.query.count()
    # print(total)
    #
    # # 设置条件,作为返回满足条件的记录数量
    # total = Student.query.filter(Student.age>16).count()
    # print(total)


    # """first()获取查询结果的第一个结果"""
    # student = Student.query.first()
    # print(student, student.name)
    #
    # student = Student.query.filter(Student.sex==True).first()
    # print(student, student.name)
    #
    # """获取查询结果的第二个结果"""
    # student = Student.query.filter(Student.sex==True)[1]
    # # print(student, student.name)
    # print("查询结果",student)



    # # 名字包含"黑"的学生
    # student_list = Student.query.filter(Student.name.contains("黑")).all()
    # print(student_list)
    #
    # # 名字以"小"开头的学生
    # student_list = Student.query.filter(Student.name.startswith("小")).all()
    # print(student_list)
    #
    # # 名字以"红"结尾的学生
    # student_list = Student.query.filter(Student.name.endswith("兰")).all()
    # print(student_list)



    # # 比较查询需要指定条件格式为: filter(模型.字段 比较运算符 值)。
    # # 运算符可以是: ==表示相等, !=不相等,> 表示大于  < 表示小于,>=大于等于,<=小于等于
    # # 单个条件的比较查询
    # student_list = Student.query.filter(Student.age>15).all()
    # print(student_list)
    #
    # # 多个条件的比较查询
    # # 要求多个条件都要满足,相当于逻辑查询中的 并且(and)!!
    # student_list = Student.query.filter(Student.age>15, Student.sex==True).all()
    # print(student_list)



    # 单条件格式:filter_by(字段=值)
    # 多条件格式:filter_by(字段=值, 字段=值, 字段=值...)
    # student_list = Student.query.filter_by(age=16).all()  # 字段添加不需要附带模型类
    # print(student_list)
    #



    # # 默认情况下, 多个条件并且的情况,可以直接基于filter或者filter_by采用逗号拼接多个查询条件实现
    # # 查询年龄大于16的男生
    # student_list = Student.query.filter(Student.age>16, Student.sex==True).all()
    # print("第一次",student_list)
    #
    # #  filter(and_(条件1,条件2,....))  等价于  filter(条件1,条件2,.....)
    # from sqlalchemy import and_
    # student_list = Student.query.filter(and_(Student.age>16, Student.sex==True)).all()
    # print("第二次",student_list)



    # # 查询年龄大于16(Student.age>16)或者钱包余额大于1500(Student.money>1500) 女生
    # from sqlalchemy import or_
    # student_list = Student.query.filter(or_(Student.age>16, Student.money>1500), Student.sex==False).all()
    # print("第一次",student_list)
    #
    # # 查询 年龄大于16的男生(Student.age>16, Student.sex==True) 和 钱包余额大于1500的女生(Student.money>1500, Student.sex==False)
    # from sqlalchemy import or_, and_
    # student_list = Student.query.filter(
    #     or_(
    #         and_(Student.age>16, Student.sex==True),
    #         and_(Student.money>1500, Student.sex==False)
    #     )
    # ).all()
    # print("第二次",student_list)

    # #逻辑非
    # student = Student.query.filter(Student.name != '小白').all()
    # print(student)

    # from sqlalchemy import not_
    # student = Student.query.filter(Student.name != '小白').all()
    # print("第一次",student)
    #
    # student = Student.query.filter(not_(Student.name == '小白')).all()
    # print("第二次",student)


    # student_list = Student.query.filter(Student.id.in_([1,3,4,5])).all()
    # print(student_list)


    # 查询邮箱为Null的用户
    # student_list = Student.query.filter(Student.email.is_(None)).all()
    # print(student_list)
    #
    # """判断是否存在"""
    # # 查询是否存在"小辉"这个学生
    # query = Student.query.filter(Student.name == "小辉").exists()
    # #通过scalar()拿到查询是否存在
    # ret = db.session.query(query).scalar()
    # print("第一次是否存在",ret)
    #
    # student = Student.query.filter(Student.name=="小明").first()
    # print("第二次是否存在",bool(student))



    # # 按年龄倒叙排序
    # student_list = Student.query.order_by(Student.age.desc()).all()
    # print(student_list)
    #
    # # 按钱包余额进行倒序,如果余额一致,按id倒序
    # student_list = Student.query.order_by(Student.money.desc(), Student.id.desc()).all()
    # print(student_list)



    #查询年龄最大的三个人
    student_list = Student.query.order_by(Student.age.desc()).limit(3).all()
    print(student_list)

    # 查询钱包余额最少的三个人
    student_list = Student.query.order_by(Student.money.asc()).limit(3).all()
    print(student_list)

    # 按钱包余额进行倒序排列,查询出排名在4-5之间的学生
    student_list = Student.query.order_by(Student.money.desc()).offset(3).limit(2).all()
    print(student_list)

    student_list = Student.query.order_by(Student.money.desc()).all()[3:5]
    print(student_list)





    return "ok"




if __name__ == '__main__':
    #要想执行创建表,需要调用db.creat_all(),db要想被调用,需要放到app上下文里面
    with app.app_context():
        # 如果没有提前声明模型中的数据表,则可以采用以下代码生成数据表,
        # 如果数据库中已经声明了有数据表,则不会继续生成
        db.create_all()
    app.run(debug=True)

总结

本文详述了flask的ORM工具SQLAlchemy各种数据查询的详细用法,包含基础查询和各种复杂查询,非常实用,感兴趣的朋友可以一键三连,flask的高阶用法持续更新中!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/553726.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Spring进行文件的上传和下载

概览 使用Spring进行文件的上传和下载Spring上传文件接口设计dubbo接口设计上传文件流的RPC的接口设计 Spring文件下载接口设计dubbo接口设计下载文件流的RPC的接口设计 spring上传文件大小控制 使用Spring进行文件的上传和下载 本文主要介绍在Spring框架下面调用微服务的dubb…

学习笔记(4月17日)vector底层原理

1.vector<vector>底层原理 vector是表示可变大小数组的序列容器&#xff0c;相当于一个动态的数组&#xff0c;比数组优越的在于它具有可动态改变的大小&#xff0c;同时&#xff0c;它写成了类模板&#xff0c;说明可以适用于其他类型&#xff0c;包括vector本身&#…

AI赋能自动化测试:智能接口自动化测试数据生成平台设计思路

目录 1.背景 2.名词解释 3.设计目标 4.设计思路及折衷 4.1阶段性任务 4.2方案选型 4.2.1 设计方案选型 4.2.1.1 原始数据获取模块 4.2.1.2 数据构造模块 4.2.1.3 预执行模块 4.2.1.4 覆盖率反馈调整模块 4.2.1.5 预测模型 4.2.2 技术选型 5.系统设计 5.1 项目架…

LeetCode669:修剪二叉搜索树

题目描述 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c;原有的父代子代关系都应…

vivo怎么录屏?玩转手机新体验!(2024最新)

“最近新入手了一款vivo手机&#xff0c;感觉用起来真的很顺手&#xff0c;各种功能都很强大。昨天和朋友一起打游戏&#xff0c;突然想到要记录下精彩瞬间&#xff0c;但是找遍了手机&#xff0c;都没有找到录屏功能。我想请教一下各位vivo手机用户&#xff0c;你们通常在哪里…

解决动态规划问题

文章目录 动态规划的定义动态规划的核心思想青蛙跳阶问题解法一&#xff1a;暴力递归解法二&#xff1a;带备忘录的递归解法&#xff08;自顶向下&#xff09;解法三&#xff1a;动态规划&#xff08;自底向上&#xff09; 动态规划的解题套路什么样的问题考虑使用动态规划&…

转录组上游分析,Count计算

本期教程原文链接&#xff1a;转录组定量&#xff0c;最简单的操作&#xff0c;你会吗&#xff1f; 本期教程 第六章 转录本定量分析 定量软件有RSEM,eXpress,salmoe,kallisto&#xff0c;featureCounts。在网络中吗&#xff0c;都有比较详细的教程&#xff0c;大家可以自己去…

最新UI发卡盗U,支持多语言,更新UI界面,支持多个主流钱包,附带系统搭建教程

环境&#xff1a;Linux系统 进入宝塔安装环境&#xff1a;Nginx 1.22.1 MySQL 8.0 php7.4 phpMyAdmin 5.2 按照说明去安装环境&#xff0c;如果没有找到MySQL8.0版本去"软件商店"搜索Mysql切换至8.0 1.上传开源源码 2.上传数据库文件 3.上传猴导入数据库文件 4.修…

SpringBoot+FreeMaker

目录 1.FreeMarker说明2.SpringBootFreeMarker快速搭建Pom文件application.properties文件Controller文件目录结构 3.FreeMarker数据类型3.1.布尔类型3.2.数值类型3.3.字符串类型3.4.日期类型3.5.空值类型3.6.sequence类型3.7.hash类型 4.FreeMarker指令assign自定义变量指令if…

HTML学习笔记:(一)基础方法

Html格式 里面文件使用平台为&#xff1a;w3school 1、基础功能&#xff1a; <html><head> <title>这是我的第一个html页面,会显示在浏览器的标题栏中</title> </head> <!--修改背景颜色 --> <body bgcolor"yellow"> …

QtQuick 学习笔记(二)按钮组件

1. QPushButton 功能 按压按钮&#xff0c;用于接受用户点击事件&#xff0c;可显示设定的字符串提示信息&#xff0c;但需要父组件作为容器&#xff0c;多用以执行命令或触发事件 常用函数 QPushButton&#xff1a;&#xff1a;QPushButton&#xff08;const QString &…

RHCE1

unit1.定时任务和延迟任务项目 1.在系统中设定延迟任务要求如下: 在系统中建立easylee用户&#xff0c;设定其密码为easylee 延迟任务由root用户建立 要求在5小时后备份系统中的用户信息文件到/backup中确保延迟任务是使用非交互模式建立 再使用chmod修改权限&#xff1a; 确保…

HarmonyOS真机调试页面运行卡顿/黑屏解决方法,亲测有效

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 用mate40等发行时间相对较早但系统是HarmonyOS4.0的真机调试 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 程序点击容易卡顿或黑屏 原因分析&#xff1a; CPU兼容问题导致屏幕…

Text2sql的一些技巧

最近看到了一篇关于text2sql的文章&#xff0c;以及一些论文。对使用模型做text2sql给了一些不错的建议。 参考文章&#xff1a;24年大模型潜力方向&#xff1a;大浪淘沙后的Text-to-SQL和Agent - 知乎 论文&#xff1a;https://arxiv.org/pdf/2403.09732.pdf 关于模型的建议 …

STM32H7定时器TIM1-TIM17中断、PWM实现

STM32H7定时器TIM1-TIM17中断、PWM实现 高级定时器硬件框图定时器模式时基输出PWM定时器输入捕获 TIM1-TIM17的中断配置TIM1-TIM17的PWM输出 STM32H7 支持的定时器有点多&#xff0c;要简单的区分下。STM32H7 支持 TIM1-TIM8&#xff0c;TIM12-TIM17 共14 个定时器&#xff0c;…

使用API有效率地管理Dynadot域名,锁定账户中的域名

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

Zynq7000系列中的时钟管理

PS&#xff08;处理系统&#xff09;时钟子系统生成的所有时钟都源自三个可编程PLL&#xff08;锁相环&#xff09;中的一个&#xff1a;CPU、DDR和I/O。时钟子系统的主要组件如图25-1所示。 在正常工作期间&#xff0c;PLL被启用&#xff0c;并由PS_CLK时钟引脚驱动。在启用P…

6.6Python之集合的基本语法和特性

集合&#xff08;Set&#xff09;是Python中的一种无序、不重复的数据结构。集合是由一组元素组成的&#xff0c;这些元素必须是不可变数据类型&#xff0c;但在集合中每个元素都是唯一的&#xff0c;即集合中不存在重复的元素。 集合的基本语法&#xff1a; 1、元素值必须是…

24卫生高级职称报名时间汇总⏰报名全流程

⏰卫生高级职称&#xff08;网上报名&#xff09;时间汇总 ✔️陕西&#xff1a;4月23日-5月24日 ✔️上海&#xff1a;4月23日-5月24日 ✔️重庆&#xff1a;4月23日—5月24日 ✔️黑龙江&#xff1a;4月23日-5月24日 ✔️浙江&#xff1a;4月23日-5月24日 ✔️云南&#xff1…

面试自救指南:女生如何巧答私密问题

在面试过程中&#xff0c;女性应聘者可能会遇到一些私人问题&#xff0c;这些问题可能涉及婚姻、家庭、生育等方面。面对这些问题&#xff0c;如何回答才能既保持真实又不失礼节呢&#xff1f; 当遇到关于婚姻状况的问题时&#xff0c;您可以选择回答&#xff1a;“我目前的婚姻…
最新文章