• python操作MongoDB数据库


    MongoDB就是多个集合组成的数据库,而每一个集合又是由多个文档组成。

    文档:

    #类似于
    {
        "_id" : ObjectId("5d2944d421b631f231d08056"),
        "username" : "李阳",
        "password" : "123456",
        "age" : 25,
        "gender" : "male",
        "dept" : [ 
            {
                "title" : "生产部"
            }, 
            {
                "title" : "品质部"
            }
        ]
    }
    #这样的被称为文档
    
    #文档是可嵌套的
    
    #文档中key值唯一、区分大小写、并且不可重复
    
    #文档中的键值对是有序的

    集合:

    #集合就是一组文档
    
    #文档类似于关系库里的行
    
    #集合类似于关系库里的表
    
    #集合中的文档无需固定的结构(非关系型)

    一、环境安装

    1、pymongo安装

    (automatic) C:UsersAdministrator>pip install pymongo

    2、检测是否安装成功

    (automatic) C:UsersAdministrator>python
    Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM
    D64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import pymongo
    >>>

    二、python操作MongoDB

    from pymongo import MongoClient
    from datetime import datetime
    from bson.objectid import ObjectId
    
    
    class MongoDatabase:
    
        def __new__(cls, *args, **kwargs):
            """单例模式"""
            if not hasattr(cls,"instance"):
                cls.instance = super(MongoDatabase,cls).__new__(cls, *args, **kwargs)
            return cls.instance
    
        def __init__(self):
            """
            连接数据库
            """
            self.client = MongoClient()
            self.db = self.client['test']
    
        def add_one(self):
            """
            添加一条数据
            :return: 
            """
            post = {
                "author": "aaa",
                "text": "bbb",
                "date": datetime.utcnow()
            }
            return self.db.table1.insert_one(post)  # 向数据库test的table1表中添加数据
    
        def get_one(self):
            """
            查询一条数据
            :return:
            """
            return self.db.table1.find_one()
    
        def get_more(self):
            """
            查询多条数据
            :return:
            """
            return self.db.table1.find({'author': 'aaa'})
    
        def get_one_from_id(self, id):
            """
            通过id查询数据
            :return:
            """
            obj = ObjectId(id)
            return self.db.table1.find_one({"_id": obj})
    
        def update_one_data(self):
            """
            通过id更新一条数据
            :return: 
            """
            result=self.db.table1.update_one({'text':'bbb'},{'$inc':{'x':10}})#找到text=bbb这条数据并且将其中的x数值加10
            return result
    
        def update_many_data(self):
            """
            更新多条数据
            :return: 
            """
            result=self.db.table1.update_many({},{'$inc':{'x':10}})#找到所有数据并且将其中的x数值加10
            return result
    
        def delete_one(self):
            """
            删除一条数据:如果有多条满足条件,只删除第一条
            :return:
            """
            result=self.db.table1.delete_one({'text':'bbb'})
            return result
    
        def delete_many(self):
            """
            删除多条数据
            :return:
            """
            result=self.db.table1.delete_many({})
            return result
    
    def main():
        mongo_obj = MongoDatabase()
        print(mongo_obj)
        # 新增数据
        # result=mongo_obj.add_one()
        # print(result.inserted_id)#5d286c7bbf18433e81e4f16f
        # 查询数据
        # result=mongo_obj.get_one()
        # print(result) #字典类型,result['id']
        # 查询多条数据
        # result=mongo_obj.get_more()
        #     # for item in result:
        #     #     print(item['text'])
        # 通过id查询数据
        # result = mongo_obj.get_one_from_id('5d286c7bbf18433e81e4f16f')
        # print(result)
        #更新一条数据
        # result=mongo_obj.update_one_data()
        # print(result.matched_count)
        # print(result.modified_count)
        #删除一条数据
        # result=mongo_obj.delete_one()
        # print(result.delete_count)
    
    if __name__ == '__main__':
        main()
    单例模式实现python操作mongodb数据库

    三、ODM操作

    1、安装mongoengine模块

    (automatic) C:UsersAdministrator>pip install mongoengine

    2、检测是否安装成功

    (automatic) C:UsersAdministrator>python
    Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM
    D64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import mongoengine
    >>>

    3、模型介绍

    mongoengine模块相当于mysql数据库中的sqlalchemy模块,对数据库进行一种对象化的操作,比起原生的操作来的更加方便。

    (1)数据类型

    BinaryField
    BooleanField
    ComplexDateTimeField
    DateTimeField
    DecimalField
    DictField
    DynamicField
    EmailField
    EmbeddedDocumentField
    EmbeddedDocumentListField
    FileField
    FloatField
    GenericEmbeddedDocumentField
    GenericReferenceField
    GenericLazyReferenceField
    GeoPointField
    ImageField
    IntField
    ListField
    MapField
    ObjectIdField
    ReferenceField
    LazyReferenceField
    SequenceField
    SortedListField
    StringField
    URLField
    UUIDField
    PointField
    LineStringField
    PolygonField
    MultiPointField
    MultiLineStringField
    MultiPolygonField

    每个字段类型都可以设置参数:

    db_field (默认值:无)
        #MongoDB字段名称。
    
    required (默认值:False)
        #如果设置为True且未在文档实例上设置字段,则在ValidationError验证文档时将引发a 。
    
    default (默认值:无)
        #未为此字段设置值时使用的值。
    
    unique (默认值:False)
        #如果为True,则集合中的任何文档都不具有此字段的相同值。
    
    unique_with (默认值:无)
        #字段名称(或字段名称列表)与此字段一起使用时,集合中不会有两个具有相同值的文档。
    
    primary_key (默认值:False)
        #如果为True,请使用此字段作为集合的主键。 DictField 和EmbeddedDocuments都支持作为文档的主键。
    
    choices (默认值:无)
        #应该限制​​该字段的值的可迭代(例如列表,元组或集合)选择。
      #例如:
        SIZE  =  (('S' 'Small' ),
                'M' 'Medium' ),
                'L' 'Large' ),
                'XL' 'Extra Large' ),
                'XXL' '额外超大' ))
        class  Shirt Document ):
            size  =  StringField max_length = 3 choices = SIZE 

    **kwargs (可选的) #可以提供其他元数据作为任意其他关键字参数。但是,您无法覆盖现有属性。常见的选择包括help_text和verbose_name,它们通常由表单和窗口小部件库使用。

    (2)创建模型

    from mongoengine import connect, Document, StringField, IntField, EmbeddedDocument, ListField, EmbeddedDocumentField
    
    connect('userinfo') #连接数据库,默认连接本地
    
    GENDER_CHOICES = (
        ('male', ''),
        ('female', ''),
    )
    
    
    class Dept(EmbeddedDocument):
        """
        部门表
        """
        title = StringField(max_length=32, required=True)
    
    
    class User(Document):
        """
        用户表
        """
        username = StringField(max_length=32, required=True)
        password = StringField(max_length=64, required=True)
        age = IntField(required=True)
        gender = StringField(choices=GENDER_CHOICES, required=True)
        dept = ListField(EmbeddedDocumentField(Dept))  # 关联部门表
    
        meta = {
            'collection': 'user'  # 指定保存在什么文档中
        }

    上面的User表相当于集合,它是继承Document类,而dept实际是User表中的一个字段,每一个用户实例都相当于一个文档(集合中的一行数据),具体可以看生成的具体数据:

    4、操作模型

    在创建模型后,就需要对模型中的数据进行CURD,创建一个类来进行操作:

    class MongoEngine(object):
    
        def add_one(self):
            """
            增加一条数据
            :return:
            """
            product_department = Dept(
                title="生产部"
            )
            quality_department = Dept(
                title="品质部"
            )
    
            user_obj = User(
                username='李阳',
                password='123456',
                age=20,
                gender='male',
                dept=[product_department, quality_department]
    
            )
            user_obj.save()
            return user_obj
    
        def get_one(self):
            """查询一条数据"""
            return User.objects.first()
    
        def get_more(self):
            """查询多条数据"""
            return User.objects.all()
    
        def get_from_id(self, id):
            """根据id进行查询"""
            return User.objects.filter(pk=id).first()
    
        def update_one(self):
            """修改单条数据"""
            return User.objects.filter(gender='male').update_one(inc__age=5)
    
        def update_more(self):
            """修改多条数据"""
            return User.objects.filter(gender='male').update(inc__age=5)
    
        def delete_one(self):
            """删除一条数据"""
            return User.objects.filter(gender='male').first().delete()
    
        def delete_from_id(self,id):
            """根据id进行删除"""
            return User.objects.get(pk=id).delete()
    
        def delete_more(self):
            """删除多条数据"""
            return User.objects.filter(gender='male').delete()

    5、完整实例

    from mongoengine import connect, Document, StringField, IntField, EmbeddedDocument, ListField, EmbeddedDocumentField
    
    connect('userinfo') #连接数据库,默认连接本地
    
    GENDER_CHOICES = (
        ('male', ''),
        ('female', ''),
    )
    
    
    class Dept(EmbeddedDocument):
        """
        部门表
        """
        title = StringField(max_length=32, required=True)
    
    
    class User(Document):
        """
        用户表
        """
        username = StringField(max_length=32, required=True)
        password = StringField(max_length=64, required=True)
        age = IntField(required=True)
        gender = StringField(choices=GENDER_CHOICES, required=True)
        dept = ListField(EmbeddedDocumentField(Dept))  # 关联部门表
    
        meta = {
            'collection': 'user'  # 指定保存在什么文档中
        }
    
    
    class MongoEngine(object):
    
        def add_one(self):
            """
            增加一条数据
            :return:
            """
            product_department = Dept(
                title="生产部"
            )
            quality_department = Dept(
                title="品质部"
            )
    
            user_obj = User(
                username='李阳',
                password='123456',
                age=20,
                gender='male',
                dept=[product_department, quality_department]
    
            )
            user_obj.save()
            return user_obj
    
        def get_one(self):
            """查询一条数据"""
            return User.objects.first()
    
        def get_more(self):
            """查询多条数据"""
            return User.objects.all()
    
        def get_from_id(self, id):
            """根据id进行查询"""
            return User.objects.filter(pk=id).first()
    
        def update_one(self):
            """修改单条数据"""
            return User.objects.filter(gender='male').update_one(inc__age=5)
    
        def update_more(self):
            """修改多条数据"""
            return User.objects.filter(gender='male').update(inc__age=5)
    
        def delete_one(self):
            """删除一条数据"""
            return User.objects.filter(gender='male').first().delete()
    
        def delete_from_id(self,id):
            """根据id进行删除"""
            return User.objects.get(pk=id).delete()
    
        def delete_more(self):
            """删除多条数据"""
            return User.objects.filter(gender='male').delete()
    
    
    def main():
        mongo_obj = MongoEngine()
        # 添加一条数据
        user_obj=mongo_obj.add_one()
        print(user_obj.id)
        # 查询一条数据
        # user_obj=mongo_obj.get_one()
        # print(user_obj.id,user_obj.username)
        # 查询所有数据
        # queryset = mongo_obj.get_more()
        # for user_obj in queryset:
        #     print(user_obj.id, user_obj.username)
        # 修改数据
        # result = mongo_obj.update_one()
        # print(result)
        # 删除数据
        # result = mongo_obj.delete_one()
        # print(result)
    
        # obj = mongo_obj.delete_from_id('5d2944a2a1bd1324ebe43d68')
        # print(obj)
    
    
    if __name__ == '__main__':
        main()
    完整实例
     
  • 相关阅读:
    网络配置
    yum源配置
    linux压缩命令
    linux下创建和删除软、硬链接
    linux挂载光盘
    Linux-chmod_命令的详细用法讲解
    linux_rpm命令
    Linux_Vi_命令
    anglarJs前端控制器的继承
    angularJs分层服务开发
  • 原文地址:https://www.cnblogs.com/shenjianping/p/11178716.html
Copyright © 2020-2023  润新知