python連接mongodb有多種orm,主流的有pymongo和mongoengine。
pymongo
安裝相關模塊
pip install pymongo
pymongo操作
- 主要對象
MongoClient對象:用於與MongoDB服務器建立連接
DataBase對象:對應着MongoDB中的數據庫
Collection對象:對應着MongoDB中的集合
Cursor對象:查詢方法find()返回的對象,用於進行多行數據的遍歷
- 主要方法
insert_one:加入一條文檔對象
insert_many:加入多條文檔對象
find_one:查找一條文檔對象
find:查找多條文檔對象
update_one:更新一條文檔對象
update_many:更新多條文檔對象
delete_one:刪除一條文檔對象
delete_many:刪除多條文檔對象
- 交互實例
# test.py
from pymongo import *
def get_col():
"""獲取一個集合對象"""
try:
# 連接mongodb,connect=False參數加上
client = MongoClient(host='192.168.1.21',port=27017, username="admin", password="123", connect=False)
# client = MongoClient("mongodb://admin:123@192.168.1.21") # 另一種寫法
col = client.tms.eegpic # 獲取集合對象
except Exception as e:
raise AttributeError("連接出錯:{err}".format(err=e))
else:
return col
if __name__ == "__main__":
col = get_col()
res = col.insert_one({'name':'cwp','age':24, 'sex':1}) # 插入一條數據
col.insert_many([{'name': 'cwp', 'age': 24, 'sex': 1},{'name': 'hhh', 'age': 24, 'sex': 1}]) # 多條
per = col.find_one() # 查詢一條
per = col.find() # 查詢所有
col.update_many({'sex': 1}, {'$set': {'name': 'haha'}}) # 更新一條
col.delete_one({'sex': 1}) # 刪除一條
flask_pymongo操作mongodb
flask_pymongo是方便pymongo集成到flask框架中,用法和pymongo幾乎一樣。
- 安裝orm
pip install flask_pymongo
- 初始化
# extensions
from flask_pymongo import PyMongo
mongo = PyMongo()
# __init__.py
app = Flask(__name__)
mongo.init_app(app=app)
# setting.py
MONGO_URL = 'mongodb://username:passwd@localhost:27017/db' # 設置連接參數
# 得到的mongo對象相當於上例的client對象,剩下的用法與pymongo幾乎一樣
flask_mongoengine操作mongodb
flask_mongoengine是mongoengine在flask框架的集成,mongoengine可以按照類似關系型數據庫來定義數據的結構,使得操作風格和關系型數據庫相似,可以使得代碼更好的維持MVC結構。
- 安裝
pip install flask_mongoengine
- 初始化配置
# extensions.py
from flask_mongoengine import MongoEngine
db = MongoEngine()
# setting.py
MONGODB_SETTINGS = {
'db': 'project1',
'host': '192.168.1.35',
'port': 12345,
'username':'webapp',
'password':'pwd123'
}
MONGODB_CONNECT = False # 在第一次訪問數據庫是才打開連接
# __init__.py
from extensions import db
app = Flask(__name__)
app.init_app(app=app)
- 定義數據庫model
# models.py
from extensions import db
class User(db.Document):
"""
用戶model
"""
meta = {
'collection': 'todo', # 指定集合
'ordering': ['-create_at'], # 指定查詢順序
'strict': False, # 是否使用嚴格模式,默認是True
'max_documents': 1000, # 文檔數
'max_size': 2000000 # 字節數
}
email = db.Document.StringField(default='') # 設置默認值
username = db.Document.StringField(max_length=50,required=True) # 最大長度,不能為空
values = ListField(IntField(), default=[])
class Book(db.Document):
author = ReferenceField(User)
通用參數:
max_length:最大長度
required:是否要求一定存在這個字段
default: 默認值;
unique:是否不能重復,true表示唯一
primary_key:是否作為主鍵
choices:枚舉,如:choices=[A,B,C],choices=((A,large),(B,small))或限制值
- 常用的字段
StringField 字符串
BinaryField 二進制
PasswordField 密碼
URLField url格式字符串
EmailField email格式字符串
IntField 整數
FloatField 浮點數
BooleanField 布爾
DateTimeField 日期
DictField 字典
FileField GridFS存儲字段
ImageField 圖像文件存儲區域
ListField 數組類型
EmbeddedDocumentField 嵌入文件
ReferenceField 引用其他的model,相當於外鍵
- 查詢
users = User.objects(username='xxx') # 獲取查詢對象
# 排序
users = User.objects(username='xxx').order_by("_id")
# 限制返回
users = User.objects(username='xxx').limit(3)
# 過濾器
first():返回第一個
all() : 返回列表
get(_id=xxx):通過id查詢
get_or_404:與.get()類似,但如果對象為DoesNotExist,則調用abort(404)。
first_or_404:與上面相同,除了.first()。
paginate:對QuerySet進行分頁。采用兩個參數,page和per_page。
paginate_field:從QuerySet中的一個文檔中分頁。參數:field_name,doc_id,page,per_page
- 添加
user = User(username='xiaoming')
user.save()
- 更新
user = User.objects(username='xxx').first()
user.update(email='626004181@qq.com')
- 刪除
user = User.objects(username='xxx').first()
user.delete()
python連接mongodb集群
# pymongo
from pymongo import MongoClient
client = MongoClient('mongodb://admin:123456@ip1:port,ip2:port,ip3:port')
# mongoengine
from mongoengine import connect
client = connect('user', host='mongodb://admin:123456@ip1:port,ip2:port,ip3:port')
# flask_mongoengine
# setting.py
MONGODB_SETTINGS = [{
'db': 'project1',
'host': '192.168.1.21',
'port': 27017,
},
{
'db': 'project1',
'host': '192.168.1.21',
'port': 27017,
},
]
參考: