def test_to__skip_not_loaded(db): doc = create_fake(Doc) db.insert_one(doc) doc = db(Doc).find_one(doc.id, {'s': False}) raw = to_mongo(doc, skip_not_loaded=True) assert raw == { '_id': doc.id, 'i': doc.i, 'e': { 'ii': doc.e.ii, 'ss': doc.e.ss, } } doc = db(Doc).find_one(doc.id, {'e.ss': False}) raw = to_mongo(doc, skip_not_loaded=True) assert raw == { '_id': doc.id, 'i': doc.i, 's': doc.s, # 'e': { # TODO: must create part of embedded document # 'ii': doc.e.ii, # } }
def test_to__not_loaded_error(db): doc = create_fake(Doc) db.insert_one(doc) doc = db(Doc).find_one(doc.id, {'s': False}) with pytest.raises(NotLoadedError): to_mongo(doc) doc = db(Doc).find_one(doc.id, {'e.ss': False}) with pytest.raises(NotLoadedError): to_mongo(doc)
async def save(self, document, **collection_params): document.__db__ = self collection = self._get_collection(document.__class__, collection_params) document._id = await collection.save(to_mongo(document)) document.__changed_clear__() return document
async def test(): documents = [Doc(i=i) for i in range(5)] result = await db.db['testdocs'].insert_many( (to_mongo(d) for d in documents)) assert len(result.inserted_ids) == len(documents) for _id in result.inserted_ids: doc = await db.get_document(Doc, _id) assert doc.id == _id
async def test(): documents = [Doc(i=i) for i in range(5)] result = await db.db['testdocs'].insert_many( (to_mongo(d) for d in documents)) assert len(result.inserted_ids) == len(documents) for _id in result.inserted_ids: doc = await db.get_document(Doc, _id, projection={'i': False}) assert doc.id == _id assert 'i' in doc.__not_loaded__
def save(self, document, full=False, upsert=False, **collection_params): """ Save document to database. :param Document document: document instance for save :param bool full: fully resave document (default: `False`) :param bool upsert: see documentation for MongoDB's `update` (default: `False`) :param **collection_params: params for get_collection If document has no `_id` :py:meth:`insert <Database.insert>` new document. """ if hasattr(document, '_id'): document.__db__ = self if full: self._get_collection(document, collection_params).update( {'_id': document.id}, to_mongo(document), upsert=upsert, multi=False, ) document.__changed_clear__() else: set_data = to_mongo( document, exclude=['_id'], include=list(document.__changed__), ) unset_data = [ f for f, v in document.__changed__.items() if v is AttributeNotSet ] self.update_one(document, set=set_data, unset=unset_data, **collection_params) return document else: return self.insert(document, **collection_params)
async def insert_one(self, document, **collection_params): document.__db__ = self collection = self._get_collection(document.__class__, collection_params) result = await collection.insert_one(to_mongo(document)) document._id = result.inserted_id document.__log__.append(Insert(id=result.inserted_id)) return result
def test_to__include(): doc = create_fake(Doc) doc.extra_doc_value = 'not serialized' raw = to_mongo(doc, include=['i', 'e.ss']) assert raw == { 'i': doc.i, 'e': { 'ss': doc.e.ss, } }
def insert(self, document): """ Insert document to database :param Document document: document instance for insert to database It's set :attr:`yadm.documents.Document._id`. """ document.__db__ = self collection = self._get_collection(document.__class__) document._id = collection.insert(to_mongo(document)) document.__fields_changed__.clear() return document
def insert_one(self, document, **collection_params): """ Insert document to database. """ document.__db__ = self collection = self._get_collection(document.__class__, collection_params) result = collection.insert_one(to_mongo(document)) document._id = result.inserted_id document.__log__.append(Insert(id=result.inserted_id)) return result
def insert(self, document): """ Insert document to database :param Document document: document instance for insert to database It's set :attr:`yadm.documents.Document._id`. """ document.__db__ = self collection = self._get_collection(document.__class__) document._id = collection.insert(to_mongo(document)) document.__fields_changed__.clear() return document
def insert_one(self, document, **collection_params): """ Insert document to database. """ document.__db__ = self collection = self._get_collection(document.__class__, collection_params) result = collection.insert_one(to_mongo(document)) document._id = result.inserted_id document.__log__.append(Insert(id=result.inserted_id)) return result
def test_serialize_cycle(self, db): doc = self.Doc() doc.money = fields.Money(1, 'RUB') db.save(doc) data = db(self.Doc).find_one() data_tm = to_mongo(data) assert data_tm['money'][0] == 100 assert data_tm['money'][1] == 643 data_fm = from_mongo(self.Doc, data_tm) assert data_fm.money == fields.Money(1, 'RUB')
def test_serialize_cycle(self, db): doc = self.Doc() doc.money = fields.Money(1, 'RUB') db.save(doc) data = db(self.Doc).find_one() data_tm = to_mongo(data) assert data_tm['money'][0] == 100 assert data_tm['money'][1] == 643 data_fm = from_mongo(self.Doc, data_tm) assert data_fm.money == fields.Money(1, 'RUB')
def save(self, document, full=False, upsert=False): """ Save document to database :param Document document: document instance for save :param bool full: fully resave document (default: `False`) :param bool upsert: see documentation for MongoDB's `update` (default: `False`) If document has not `id` this :meth:`insert` new document. """ if hasattr(document, '_id'): document.__db__ = self if full: self._get_collection(document).update( {'_id': document.id}, to_mongo(document), upsert=upsert, multi=False, ) else: self._get_collection(document).update( {'_id': document.id}, { '$set': to_mongo(document, exclude=['_id'], include=document.__fields__.keys()), # include=document.__fields_changed__), # must be! }, upsert=upsert, multi=False, ) document.__fields_changed__.clear() return document else: return self.insert(document)
def insert(self, document): """ Insert document to database. :param Document document: document instance for insert to database It's bind new document to database set :py:attr:`_id <yadm.documents.Document._id>`. """ document.__db__ = self collection = self._get_collection(document.__class__) document._id = collection.insert(to_mongo(document)) document.__changed_clear__() return document
def test_to__exclude(): doc = create_fake(Doc) doc.extra_doc_value = 'not serialized' raw = to_mongo(doc, exclude=['i']) assert raw == { '_id': doc.id, 's': doc.s, 'e': { 'ii': doc.e.ii, 'ss': doc.e.ss, } }
def save(self, document, full=False, upsert=False): """ Save document to database :param Document document: document instance for save :param bool full: fully resave document (default: `False`) :param bool upsert: see documentation for MongoDB's `update` (default: `False`) If document has not `id` this :meth:`insert` new document. """ if hasattr(document, '_id'): document.__db__ = self if full: self._get_collection(document).update( {'_id': document.id}, to_mongo(document), upsert=upsert, multi=False, ) else: self._get_collection(document).update( {'_id': document.id}, {'$set': to_mongo( document, exclude=['_id'], include=document.__fields__.keys()), # include=document.__fields_changed__), # must be! }, upsert=upsert, multi=False, ) document.__fields_changed__.clear() return document else: return self.insert(document)
async def save(self, document, **collection_params): document.__db__ = self if not hasattr(document, 'id'): document.id = ObjectId() raw = to_mongo(document) collection = self._get_collection(document, collection_params) await collection.find_one_and_replace( filter={'_id': document.id}, replacement=raw, return_document=pymongo.collection.ReturnDocument.AFTER, upsert=True, ) document.__log__.append(Save(id=document.id)) return document
async def find_one_and_replace(self, document, *, return_document=ReturnDocument.BEFORE): """ Find a single document and replace it. """ data = await self._collection.find_one_and_replace( filter=self._criteria, projection=self._projection, replacement=to_mongo(document), sort=self._sort, return_document=return_document, ) if data is None: # pragma: no cover return None return self._from_mongo_one(data, projection=self._projection)
def insert(self, document): """ Add insert document to bulk. :param Document document: document for insert .. warning:: This unlike :py:class:`Database.insert <yadm.database.Database.insert>`! Currently, it is not bind objects to database and set id. """ if not isinstance(document, self._document_class): raise TypeError("Bulk.insert() argument must be a {}, not '{}'" "".format(self._document_class, document.__class__)) self._bulk_mongo.insert(to_mongo(document))
async def find_one_and_replace(self, document, *, return_document=ReturnDocument.BEFORE): """ Find a single document and replace it. """ data = await self._collection.find_one_and_replace( filter=self._criteria, projection=self._projection, replacement=to_mongo(document), sort=self._sort, return_document=return_document, ) if data is None: # pragma: no cover return None return self._from_mongo_one(data, projection=self._projection)
def insert_one(self, document): self._batch.append(InsertOne(to_mongo(document)))
def replace_one(self, cliteria, document, upsert=False): self._batch.append( ReplaceOne(cliteria, to_mongo(document), upsert=upsert))
def insert_one(self, document): self._batch.append(InsertOne(to_mongo(document)))
def gen(documents): for document in documents: yield to_mongo(document) document.__log__.append(Insert())
def to_mongo(self, document, value): if value is None: return None else: return to_mongo(value)
def to_mongo(self, document, value): return to_mongo(value)
def to_mongo(self, document, value): return to_mongo(value)
async def test(): assert (await db.update_one(doc)) is None assert (await db.db['testdocs'].find_one(doc.id)) == to_mongo(doc)
def gen(documents): for document in documents: yield to_mongo(document) document.__log__.append(Insert())
def replace_one(self, cliteria, document, upsert=False): self._batch.append(ReplaceOne(cliteria, to_mongo(document), upsert=upsert))