python 数据库编程(mongoDB)

   mongoDB是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。关系型数据库遵循原子性,一致性,独立性,持久性规则,而非关系型数据库不需要固定的模式,无需多余的操作就可以横向扩展。

  1.  在官网下载安装mongodb数据库  

    https://www.mongodb.com/download-center?jmp=nav#community

  2.  在命令行中启动服务器控制台

    mongod.exe --nojournal --dbpath .     无日志,保存与当前路径,切换到安装目录下的bin目录中启动

  3.  启动客户端

    mongo.exe

  4.  常用操作

    use test                 #切换数据库,使用test数据库
    db.blogg.insert({'id':1,'title':'myblog'})                   #向当前数据库blogg表中插入文档
    db.blogg.find()                      #查询当前数据库blogg表中的文档
    db.blogg.find({'id':1})
    db.blogg.findOne()
    db.blogg.update({'id':2},{'$set':{'title':'yourBlog'}})               #使用$set修改指定键值对
    db.blogg.update({'id':2},{'$set':{'title-2':'yourBlog'}})               #如果键值不存在则使用$set增加指定键值对
    db.blogg.update({'id':2},{'$unset':{'title-2':'yourBlog'}})         #使用$unset取消指定键值对
    db.blogg.update({'id':2},{'$inc':{'id':1}})                       #增减指定键的值,id=3
    db.blogg.update({'id':4},{'$set':{'size':4}},true)            #第三个参数为true,无则创建,有匹配更新
    db.blogg.update({'id':1},{'$set':{'commet':'mm'}},false,true)         #第四个参数为true,更新多个匹配文档
    db.blogg.remove({'id':4})           #删除指定的文档
    show dbs        #显示所有数据库
    show collections          #显示所有的集合
    db.blog.drop()                #删除blog这个集合
    db.dropDatabase()          #删除数据库

  5.  python连接mongodb,安装连接mongo的驱动,pip install pymongo

>>> import pymongo
>>> pymongo.version
'3.5.1'
>>> mc = pymongo.MongoClient()  #连接数据库
>>> db_proj = mc.proj  #指定数据库
>>> col_stud = db_proj.stud  #指定集合
>>> adoc = {'id':1,'name':'mike','age':12,'parents':['green','john']}
>>> col_stud.insert_one(adoc)   #插入文档
<pymongo.results.InsertOneResult object at 0x0000023B9A5C2848>
>>> col_stud.find_one()  ##查询
{'name': 'mike', '_id': ObjectId('59d5ce9c5dc75f55d0389247'), 'id': 3, 'age': 15}
>>> col_stud.update_one({'name':'mike'},{'$set':{'age':11}})  #更新
<pymongo.results.UpdateResult object at 0x0000023B9A5DC848>
>>> col_stud.find_one({'name':'mike'})['age']
11
>>> col_stud.replace_one({'name':'mike'}, {'id':3,'name':'mike','age':15})  #替换
<pymongo.results.UpdateResult object at 0x0000023B9A5DC908>
>>> for doc in col_stud.find({'id':3}):
    print(doc['id'],doc['name'],doc['age'])

    
3 mike 15
3 mary 13

  6.  mongoengine,安装pip install mongoengine

>>> from mongoengine import *
>>> connect('test')
MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True, read_preference=Primary())
>>> class User(Document):
    uid = SequenceField(primary_key=True)
    name = StringField(null=True,required=True)
    age = IntField(min_value=6,max_value=16)
    weight = FloatField(max_value=60)
>>> u = User()
>>> u.name = 'mary'
>>> u.age = 11
>>> u.weight=30.7
>>> u.save()
<User: User object>
>>> ua = User(name='honey',age=13,weight=28.9)
>>> ua.save()
<User: User object>
>>> u.id
3
>>> ua.id
4
>>> u.update(age=14)
1
>>> u.reload()   # #先reload(),后访问
<User: User object>
>>> u.age
14
>>> u.update(inc__age=2) # #使用自增
1
>>> u.reload()
<User: User object>
>>> u.age
16
>>> u.delete()  #删除数据,数据依然存在与内存中,但是在数据库中已不存在
>>> User.objects
[<User: User object>, <User: User object>, <User: User object>]
>>> User.objects[0]
<User: User object>
>>> for item in User.objects:
    print(item.name,item.age,item.weight)

    
Jone 13 32.5
Mike 12 30.5
honey 13 28.9
>>> User.objects.count()
3
>>> len(User.objects)
3

  7.  mongodbengine查询

    >>> class User(Document):
            userid = SequenceField(primary_key=True)
            name = StringField(max_length=20)
            age = IntField(min_value=6,max_value=17)
            weight = FloatField(max_value=60)
    
            
    >>> users_data = [{"name":"Mike","age":12,"weight":30.5},]
    >>> users_data = [{"name":"Mike","age":12,"weight":30.5},{"name":"Jone","age":13,"weight":32.5},{"name":"lily","age":12,"weight":34.5},{"name":"lisa","age":12,"weight":31.8}]
    >>> for d in users_data:
        User(**d).save()                                 #字典对象
    
        
    <User: User object>
    <User: User object>
    <User: User object>
    <User: User object>
    >>> for d in User.objects:
          print(d.userid,d.name,d.age,d.weight)
    
        
    2 Jone 13 32.5
    1 Mike 12 30.5
    3 lily 12 34.5
    4 lisa 12 31.8
    >>> User.objects.sum('age')
    49
    >>> User.objects.sum('age') / User.objects.count()
    12.25
    >>> User.objects(age__lt=13).sum('weight')
    96.8
    >>> User.objects .average('age')
    12.25
    >>> User.objects.distinct('age')              #distinct(),去重
    [13, 12]
    >>> d = User.objects(age=12).only('name').first()             #only(),只包含'name'
    >>> d.userid
    1
    >>> d.name
    'Mike'
    >>> d.age
    >>> d.weight
    >>> d = User.objects(age=12).exclude('name').first()           #exclude(),只去除'name'
    >>> d.userid
    1
    >>> d.name
    >>> d.age
    12
    >>> d.reload()                                       #使用reload()重新加载
    <User: User object>
    >>> d.name
    'Mike'
    >>> d = User.objects(age=12).exclude('name').all_fields().first()                    #all_fields(),所有值
    >>> d.userid 
    1
    >>> d.name
    'Mike'
    >>> d.age
    12
    >>> d.weight
    30.5
    >>> for d in User.objects(weight__gt=31):                    #gt         大于
          print(d.userid,d.name,d.age,d.weight)
    
        
    2 Jone 13 32.5
    3 lily 12 34.5
    4 lisa 12 31.8
    >>> for d in User.objects(weight__ne=31):                  #ne         不等于
          print(d.userid,d.age,d.name,d.weight)
    
        
    2 13 Jone 32.5
    1 12 Mike 30.5
    3 12 lily 34.5
   4 12 lisa 31.8

  8. 一对一关系,使用ReferenceField建立一对一关联关系

    >>> class Waiter(Document):
          name = StringField(max_length=20)
          custom = ReferenceField(User)                    #使用ReferenceField建立一对一关联关系
    
        
    >>> w = Waiter()
    >>> w.name = 'Wtr A'
    >>> w.custom = d
    >>> w.save()
    <Waiter: Waiter object>
    >>> w = Waiter.objects.first()
    >>> w.name
    'Wtr A'
    >>> w.custom.name
    'lisa'
    >>> w.custom.age
    12

  9.  一对多

>>> class Member(EmbeddedDocument):
    name = StringField(max_length=20)
    
>>> class Team(Document):
    name = StringField(max_length=30)
    members = ListField(EmbeddedDocumentField(Member))
    
>>> ma = Member(name='Lisa')
>>> mb = Member(name='Mike')
>>> t = Team(name='victory',members=[ma,mb])
>>> t.save()
<Team: Team object>
>>> t = Team.objects[0]
>>> for m in t.members:
    print(m.name)

    
Lisa
Mike

  10.  对文件读写

>>> class Uf(Document):
      name = StringField()
      photo = FileField()
    
>>> fp = open(r'C:Userswl18883Desktoppythonpython DB	est.jpg','rb')
>>> uf = Uf(name='Lisa')
>>> uf.photo.put(fp,content_type='image/jpeg')
>>> uf.save()
<Uf: Uf object>
>>> fp.close()
>>> p = Uf.objects[0].photo.read()
>>> fp = open(r'C:Userswl18883Desktoppythonpython DB
icai.jpg','wb+')
>>> fp.write(p)
45191
>>> fp.close()
原文地址:https://www.cnblogs.com/homle/p/8833911.html