详解python中mongoengine库用法

详解Python中Mongoengine库用法

简介

Mongoengine是Python语言的MongoDB数据ORM库,提供了简单直接的方式给开发人员在Python应用程序中使用MongoDB进行数据存储和访问。

本文将详细讲解Mongoengine库的基本用法,包括安装、连接数据库、定义文档模型、增删改查等操作。

安装

Mongoengine库可以通过pip包管理器进行安装,使用以下命令即可:

```shell script
pip install mongoengine


## 连接数据库

在使用Mongoengine库之前,我们需要先连接MongoDB数据库。在连接MongoDB之前,需要确保MongoDB已经启动。

Mongoengine使用类似于URI的连接字符串来连接MongoDB,格式为:

mongoengine.connect(db='数据库名称', host='主机地址', port=端口号)


以下是连接MongoDB的示例代码:

```python
import mongoengine

mongoengine.connect(db='mydatabase', host='localhost', port=27017)

定义文档模型

在Mongoengine中,文档模型(Document Model)是指描述数据结构和相关方法的类。每个模型对应MongoDB数据库中的一个集合(Collection)。

使用Mongoengine创建文档模型需要继承mongoengine.Document类。

以下是定义一个用户文档模型的示例代码:

import mongoengine

class User(mongoengine.Document):
    name = mongoengine.StringField(required=True)
    age = mongoengine.IntField(default=0)
    email = mongoengine.EmailField(required=True)

在上面的示例代码中,定义了一个包含三个字段的用户文档模型:

  • name:字符串类型,必填字段,表示用户名
  • age:整数类型,可选字段,表示用户年龄,默认值为0
  • email:邮件地址类型,必填字段,表示用户邮箱

增删改查

Mongoengine提供了灵活且易用的API进行数据的增删改查。以下是Mongoengine的常用API:

插入数据

想要插入一条记录,只需要创建一个文档对象并调用文档对象的save()方法。以下是插入一条记录的代码示例:

user = User(name='Tom', age=18, email='tom@example.com')
user.save()

查询数据

Mongoengine提供了多种查询数据的方式,包括按条件查询、排序、分页等。以下是按条件查询的代码示例:

# 查询年龄大于等于18岁的用户
users = User.objects(age__gte=18)

# 查询邮箱为指定值的用户
users = User.objects(email='tom@example.com')

更新数据

Mongoengine可以通过直接替换字段值的形式来更新数据。以下是更新一条记录的代码示例:

user = User.objects(name='Tom').first()
user.age = 20
user.save()

删除数据

Mongoengine提供了多种删除数据的方式,包括按条件删除、删除所有记录等。以下是按条件删除的代码示例:

# 删除年龄大于等于18岁的用户
User.objects(age__gte=18).delete()

示例说明

示例1:使用Mongoengine实现图片上传

以下是使用Mongoengine实现图片上传的完整代码示例:

import os
import mongoengine
from flask import Flask, request, redirect, url_for
from werkzeug.utils import secure_filename

app = Flask(__name__)

app.config['MONGODB_SETTINGS'] = {
    'db': 'mydatabase',
    'host': 'localhost',
    'port': 27017
}

mongoengine.connect(**app.config['MONGODB_SETTINGS'])

ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}

class Image(mongoengine.Document):
    name = mongoengine.StringField(required=True)
    data = mongoengine.FileField(required=True)

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            image = Image(name=filename, data=file)
            image.save()
            return redirect(url_for('view_image', filename=filename))
    return '''
    <!doctype html>
    <html>
    <body>
        <h1>Upload a new image</h1>
        <form action="" method=post enctype=multipart/form-data>
            <p><input type=file name=file>
            <input type=submit value=Upload>
        </form>
    </body>
    </html>
    '''

@app.route('/view/<filename>')
def view_image(filename):
    image = Image.objects(name=filename).first()
    if image:
        return """
        <img src="/static/{}" alt="{}">
        """.format(filename, filename)
    return "Image not found"

if __name__ == '__main__':
    app.run(debug=True)

示例2:使用Mongoengine实现日记应用

以下是使用Mongoengine实现日记应用的完整代码示例:

import mongoengine
from flask import Flask, request, redirect, url_for

app = Flask(__name__)

app.config['MONGODB_SETTINGS'] = {
    'db': 'mydatabase',
    'host': 'localhost',
    'port': 27017
}

mongoengine.connect(**app.config['MONGODB_SETTINGS'])

class Diary(mongoengine.Document):
    title = mongoengine.StringField(required=True)
    content = mongoengine.StringField(required=True)

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        title = request.form['title']
        content = request.form['content']
        diary = Diary(title=title, content=content)
        diary.save()
        return redirect(url_for('view_diary', diary_id=str(diary.id)))
    else:
        diaries = Diary.objects()
        return '''
        <!doctype html>
        <html>
        <body>
            <h1>Add a new diary</h1>
            <form method="POST">
                <label for="title">Title:</label>
                <input type="text" name="title"><br><br>
                <label for="content">Content:</label>
                <textarea name="content" rows="10" cols="50"></textarea><br><br>
                <input type="submit" value="Save">
            </form>
            <hr>
            <h1>All diaries</h1>
            {}
        </body>
        </html>
        '''.format(''.join(['<p><a href="{}">{}</a></p>'.format(url_for('view_diary', diary_id=str(diary.id)), diary.title) for diary in diaries]))

@app.route('/diary/<diary_id>')
def view_diary(diary_id):
    diary = Diary.objects(id=diary_id).first()
    if diary:
        return '''
        <!doctype html>
        <html>
        <body>
            <h1>{}</h1>
            <p>{}</p>
        </body>
        </html>
        '''.format(diary.title, diary.content)
    return "Diary not found"

if __name__ == '__main__':
    app.run(debug=True)

总结

本文详细讲解了Python中Mongoengine库的基本用法,包括安装、连接数据库、定义文档模型、增删改查等操作。通过两个示例程序的演示,读者可以更好地理解Mongoengine的使用方法以及其在实际应用中的作用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解python中mongoengine库用法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • SQL中where和having的区别详解

    标题 SQL中where和having的区别详解 简介 在使用SQL语言进行数据查询时,where和having是两个常用的条件语句。在实际使用中,它们有着不同的用途和特点。本文将详细讲解where和having的区别,并提供实例作为示范。 where的定义和用途 where是SQL语句中常见的条件语句之一,可以在查询过程中筛选符合条件的数据。一般情况下,w…

    database 2023年5月18日
    00
  • centos7下部署Redis

    1.1. Redis的安装 Redis是c语言开发的。 安装redis需要c语言的编译环境。如果没有gcc需要在线安装。yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到linux系统。 第二步:解压缩redis。 第三步:编译。进入redis源码目录。make 第四步:安装。make install PREFIX=/usr…

    Redis 2023年4月13日
    00
  • MSSQL基本语法及实例操作语句

    下面我将详细讲解MSSQL基本语法及实例操作语句的完整攻略。 一、MSSQL基本语法 1.1 数据库操作 1.1.1 创建数据库 创建一个名为test的数据库: CREATE DATABASE test; 1.1.2 删除数据库 删除名为test的数据库: DROP DATABASE test; 1.2 表操作 1.2.1 创建表 创建一个名为student…

    database 2023年5月21日
    00
  • MyBatis-Plus多表联查(动态查询)的项目实践

    下面是“MyBatis-Plus多表联查(动态查询)的项目实践”的完整攻略: 1. 背景 在使用MyBatis-Plus进行多表关联查询时,我们有两种常见方法: 使用MyBatis的XML文件进行联表查询; 使用MyBatis-Plus的Wrapper进行联表查询并实现动态查询。 本篇攻略主要介绍第二种方法的实际应用。 2. 使用MyBatis-Plus的W…

    database 2023年5月22日
    00
  • mysql定时自动备份数据库的方法步骤

    下面是关于如何使用MySQL实现定时自动备份数据库的方法步骤及示例说明。 一、准备工作 在进行MySQL定时自动备份操作之前,需要做好以下准备工作: 确认备份策略:定期备份是保障数据安全的重要措施,但需要根据业务需求制定好备份策略,包括备份频率、存储位置、备份方式等。 安装定时任务工具:MySQL自带定时任务功能,但不太方便,因此建议安装第三方定时任务工具,…

    database 2023年5月22日
    00
  • SQL Server 总结复习 (二)

    下面是对”SQL Server 总结复习(二)”的完整攻略。 概述 这篇文章主要是关于SQL Server的一些总结,包括索引、事务和锁等常用的基本概念。同时还包括一些细节问题的解答,可以帮助我们更好地理解和使用SQL Server。 索引 索引的类型 普通索引:也叫非聚集索引,它的单次查询速度通常比聚集索引快,但是增加、更新和删除操作可能要更慢一些,在实际…

    database 2023年5月21日
    00
  • MySQL的事务特性概念梳理总结

    MySQL的事务特性概念梳理总结 MySQL是一种SQL关系型数据库管理系统,支持ACID事务特性。ACID是指:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。在MySQL中,对于事务的处理涉及到以下几个主要概念: 1. 数据库事务 数据库事务是指一组数据库操作组成的一个逻辑工作…

    database 2023年5月22日
    00
  • oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert

    首先,我们需要创建一张表,用于存储数据。这里以创建一个名为“student”的表为例: CREATE TABLE student ( id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, gender VARCHAR(10) NOT NULL, age INT(11) NOT NULL,…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部