• Flask框架——MongoEngine使用MongoDB数据库


    目录

    MongoEngine

    安装

    配置

    映射文档

    添加数据

    添加单条数据

    添加多条数据

    查询数据

    修改数据

    删除数据


    上篇文章我们学习了Flask框架——Bootstrap-Flask使用,这篇文章我们学习Flask框架——MongoEngine使用MongoDB数据库。

    MongoEngine

    在Flask框架中使用MongoEngine需要通过Flask-MongoEngine包来对MongoEngine进行配置。

    Flask-MongoEngine是MongoEngine的Flask封装。

    MongoEngine是在pyMongo的基础上构建的一个文档对象映射器,为用户提供基本的数据模型以及类型约束,并对PyMongo的数据查询做了进一步的封装,避免直接书写MongoDB查询语句,简化数据查询。

    安装

    安装方式很简单,执行如下命令安装MongoEngine即可:

    pip install flask-mongoengine
    

    配置

    在使用MongoEngine之前,需要对MongoDB进行必要的配置,示例代码如下:

    1. from flask import Flask
    2. from flask_mongoengine import MongoEngine
    3. app = Flask(__name__)
    4. app.config['MONGODB_SETTINGS']={    #通过MONGODB_SETTINGS配置MongoEngine
    5.     'db':'myproject'
    6. }
    7. db=MongoEngine(app)          #初始化MongoEngine配置
    8. if __name__ == '__main__':
    9.     app.run()

    MONGODB_SETTINGS配置中,我们只添加了db参数——将要访问的数据库名称,除了这个参数,我们还可以添加以下参数:

    • alias:建立的数据库连接的别名,默认为:default;

    • db:访问的数据库名,默认为test;

    • host:MongoDB服务器地址,默认为localhost;

    • port:MongoDB服务器端口号,默认为27017;

    • username:用户名;

    • password:用户密码;

    • authentication_source:认证源,创建该用户的数据库;

    • is_mock:是否使用 mongomock;

    • connect: 是否直接连接服务器,如果为false,则直到第一次操作时才会连接服务器;

    • tz_aware:是否自动识别时区,如果为false,则直接使用本地时间,忽略datetime的时区配置。

    除了通过MONGODB_SETTINGS对MongoEngine配置,我们还可以使用"MONGODB_"来单独提供连接配置,示例代码如下:

    1. app.config['MONGODB_DB'] = 'test'      #数据库名称
    2. app.config['MONGODB_HOST'] = 'localhost'    #服务器地址
    3. app.config['MONGODB_PORT'] = 27017      #服务器端口号
    4. app.config['MONGODB_USERNAME'] = 'root'     #用户名
    5. app.config['MONGODB_PASSWORD'] = '123456'    #用户密码

    除了上面的单独连接配置,可以添加以下配置:

    • MONGODB_ALIAS:建立的数据库连接的别名,默认为:default;

    • MONGODB_IS_MOCK:是否使用 mongomock;

    • MONGODB_CONNECT:是否直接连接服务器,如果为false,则直到第一次操作时才会连接服务器;

    • MONGODB_TZ_AWARE:是否自动识别时区,如果为false,则直接使用本地时间,忽略datetime的时区配置。

    注意:当我们使用了MONGODB_SETTINGS配置时,其他单独连接配置无效。

    映射文档

    首先创建一个名为Student学生模型类,该模型类需要继承Document的子类,再根据需要添加字段,示例代码如下:

    1. import mongoengine as me
    2. class Student(me.Document):    #创建Student学生模型类并继承Document类
    3.     S_name=me.StringField()    #学生名字段,字段类型为StringField
    4.     S_password=me.StringField()   #密码字段,字段类型为StringField

    这里创建了名为Student学生模型类并继承Document类,在类中我们创建了学生名字段和密码字段,他们的字段类型都为StringField,除了StringField字段,MongoEngine还支持以下字段:

    • StringField:字符串字段;

    • BinaryField:二进制字段;

    • URLField:网址字段;

    • EmailField:电子邮件字段;

    • IntField:整型字段;

    • FloatField:浮点型字段;

    • DecimalField:十进制字段;

    • BooleanField:布尔型字段;

    • DateTimeField:日期时间字段

    • ListField :列表字段;

    • SortedListField :重复性列表字段;

    • EmbeddedDocumentField :使用 wtforms.fields.FormField 并生成内联表单;

    • ReferenceField:使用 wtforms.fields.SelectFieldBase 和从 QuerySet 或 Document 加载的选项;

    • DictField:字典字段。

    当然我们还可以在字段中添加参数,例如required=True,表示必填项。

    当我们需要在Student模型类中嵌套其他字段时,那么可以在类中继承EmbeddedDocument来定义嵌套模型类,并在父模型类中使用EmbeddedDocumentField声明相应的字段。

    例如:我们为Student模型类嵌套联系人和手机号字段,首先创建一个名为Contacts的模型类并继承EmbeddedDocument子类,实例代码如下:

    1. class Contacts(me.EmbeddedDocument):
    2.     contacts = me.StringField()
    3.     phone = me.IntField()

    创建Contacts模型类之后,还需要在父模型类中使用EmbeddedDocumentField声明相应的字段,示例代码如下:

    1. class Student(me.Document):
    2.  ...
    3.  S_contacts = me.EmbeddedDocumentField(Contacts)

    添加数据

    添加数据我们通过在上面的配置MongoEngine的Flask程序中添加视图函数进行演示,查看MongoDB数据库我们是通过Navicat Premium 15数据库可视化软件进行查看。

    添加单条数据

    添加单条数据,创建实例化Student模型类对象中传入数据即可,示例代码如下:

    1. @app.route('/')
    2. def add_data():
    3.     student = Student(S_name='小明',S_password='12345')  #添加数据
    4.     student.S_contacts=Contacts(       #添加嵌套数据
    5.         contacts='小芳',
    6.         phone=13700000000
    7.     )
    8.     student.save()           #保存添加
    9.     return '添加成功'

    启动Flask程序,访问http://127.0.0.1:5000/后即可添加数据,如下图所示:

    点击上图红框的展开按钮,即可看到添加的嵌套字段数据,如下图所示:

    添加多条数据

    添加多条数据需要利用模型类中的objects属性,示例代码如下所示:

    1. @app.route('/adds')
    2. def add_datas():
    3.     student=[Student(S_name='张三',S_password='12345',S_contacts=Contacts(contacts='小芳',phone=13700000000)),
    4.              Student(S_name='李四',S_password='12345',S_contacts=Contacts(contacts='小芳',phone=13700000000)),
    5.      Student(S_name='小明',S_password='12345',S_contacts=Contacts(contacts='小米',phone=13700000000))]     #创建数据列表
    6.     Student.objects.insert(student)   #添加数据
    7.     return '添加成功'

    首先创建一个名为student的里面,在列表中创建实例化Student类对象并传入数据,最后通过模型类中objects属性的insert方法插入数据,启动Flask程序,访问http://127.0.0.1:5000/adds,这样就成功添加了数据,如下图所示:

    查询数据

    查询全部数据

    使用模型类中objects属性的all(),语法格式为:

    1. 模型类.objects().all()       #返回所有数据
    2. 模型类.objects(模型类字段='值').all()   #返回满足条件的所有数据

    示例代码如下:

    1. @app.route('/find_all')
    2. def find_all():
    3.     student=Student.objects().all()    #查找Student类中的全部数据返回给student
    4.     return render_template('index.html',student=student)  #渲染index.html,并传递student

    首先使用Student模型类中objects属性的all()方法获取Student中的所有数据并传递变量给student,再使用render_template()方法渲染index.html并传递变量student。

    index.html示例代码如下:

    1. {% for stu in student %}
    2.     学生名:{{ stu.S_name }}
    3.     密码:{{ stu.S_password }}
    4.     联系人:{{ stu.S_contacts.contacts }}
    5.     手机号:{{ stu.S_contacts.phone }}
    6.     
    7. {% endfor %}

    这里使用了for循环来遍历接收传递student变量,并通过.模型类字段的方式获取对应的数据。

    启动Flask程序,并访问http://127.0.0.1:5000/find_all,如下图所示:

    查询单条数据

    查询单条数据使用模型类中objects属性的first(),语法格式为:

    1. 模型类.objects().first()      #返回第一条数据
    2. 模型类.objects(模型类字段='值').first()   #返回满足条件的第一条数据

    示例代码如下:

    1. @app.route('/find_first')
    2. def find_first():
    3.     student=Student.objects(S_name='小明').first()   #返回学生名为小明的第一条数据返回给student
    4.     return render_template('index_first.html',student=student)  #渲染index_first.html,并传递student

    使用Student模型类中objects属性的first()方法获取Student中的第一条数据并传递给变量student,再使用render_template()方法渲染index_first.html并传递变量student。

    index_first.html示例代码如下:

    1.     学生名:{{ student.S_name }}<br>
    2.     密码:{{ student.S_password }}<br>
    3.     联系人:{{ student.S_contacts.contacts }}<br>
    4.     手机号:{{ student.S_contacts.phone }}<br>
    5.     <br>

    启动Flask程序,访问http://127.0.0.1:5000/find_all,如下图所示:

    修改数据

    修改数据首先要找到要修改的数据,再使用update()方法来修改,update()语法格式为:

    update(模型类字段='修改值')
    

    示例代码如下:

    1. @app.route('/update')
    2. def update():
    3.     student=Student.objects(S_name='小明').first()   #查询学生名为小明的第一条数据
    4.     if not student:            #数据不存在时,返回数据不存在
    5.         return '数据不存在'
    6.     student.update(S_name='王五')       #修改数据
    7.     return '修改成功'

    启动Flask程序,访问http://127.0.0.1:5000/update后,查看MongoDB数据库,如下图所示:

    这样就成功修改了数据,当我们需要批量修改数据时,只需要把查询数据的first()方法改为all()即可

    删除数据

    删除数据首先要找到要删除的数据,再使用delete()方法来删除,示例代码如下:

    1. @app.route('/delete')
    2. def delete():
    3.     student=Student.objects(S_name='王五').first()  #查询名为王五的第一条数据
    4.     if not student:           #当数据不存在时返回数据不存在
    5.         return '数据不存在' 
    6.     student.delete()         #删除数据
    7.     return '删除成功'

    启动Flask程序,访问http://127.0.0.1:5000/delete,查看MongoDB数据库,如下图所示:

    这样就成功删除数据了,当我们需要批量删除数据时,把查询数据的first()方法改为all()方法即可。

    好了,Flask框架——通过MongoEngine使用MongoDB就讲到这里了,感谢观看,下篇文章学习Flask框架——基于Celery的后台任务

    公众号:白巧克力LIN

    该公众号发布Python、数据库、Linux、Flask、自动化测试、Git等相关文章!

    - END -

  • 相关阅读:
    免费在英伟达官网使用多个开源AI大模型
    【数据分享】《2020年中国人口普查年鉴》
    ES6中 Promise 概念、基本用法和封装ajax(json数据使用)
    知识图谱实战应用28-基于py2neo的ICD-11疾病分类的知识图谱的查询与问答实战应用
    【HMS Core】华为分析SDK如何申请数据导出功能?
    凌特杯,第二届,数字音频传输。simulink matlab
    多神经网络模型联合训练,全连接神经网络模型
    C++中的多态和虚函数
    java毕业设计蛋糕网店mybatis+源码+调试部署+系统+数据库+lw
    C#委托初步
  • 原文地址:https://blog.csdn.net/weixin_52122271/article/details/126214545