详解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技术站