MongoDB:从安装到实现

第4部分介绍使用MongoDB——和充分利用

- - -

图片由沼泽卡洛Unsplash

回顾

第三部分,我们开始着手FastAPI月度预算的一部分应用程序项目。首先,我们下载必要的模块,开始实现。因为MongoDB使用NoSQL,我们不得不变得更有创造性。一旦pymongo连接和工作,我们可以连接到数据库。对于每一个集合,我们创建了一个端点每个文档。

延续

接下来,我们可以在其他端点插入和删除工作。在我们这么做之前,我们可以在MongoDB还介绍如何删除结束,正如我们以前只介绍了如何插入到集合。

在这个时候,我们不会讨论如何更新。这将在接下来的部分。因为MongoDB NoSQL、更新更复杂。例如,在杂货店集合,有一个嵌套的项目文档。更新一个嵌套文档,尤其是没有ID,使它更加困难。为了进一步讨论该做什么,我们将使用一个单独的部分。现在,我们将专注于简单的插入和删除。

另一个注意解决是我们送去了娱乐与验证需求,主要是某些变量类型是必需的。这样一个类型是双。不幸的是,pydantic支持浮动,但不是翻倍。所以,为此,请注意,我把娱乐收集和重新创建它没有任何验证。

再次测试,我们将使用邮递员,uvicorn运行python应用程序。现在我们有一个小的背景和方向,我们可以开始通过打开MongoDB。我将跳过这一步,我们已经讨论了在先前的部分。

在MongoDB删除

实践中,我们将需要能够删除数据。不用担心,我们可以将一些示例数据插入杂货集合。

接下来,因为这是样本数据,我们需要从杂货店中删除该文档集合。这样,我们可以用它来测试API的一部分。

删除,我们使用关键字“删除”:

db.Grocery.remove ({_id: ObjectId (“< IdHere >”)})

插入端点杂货店

开始前,我们需要首先使用一个基本类图我们的领域。这将发生在app.py文件并使用pydantic。在进口中,添加以下行:

从pydantic进口BaseModel

接下来,我们将需要声明的类。之前应该发生在应用程序声明但端点。第一节课我们需要是一个条目类,稍后将被嵌入在杂货类列表。

类项目(BaseModel):
ProductName: str
UnitPrice:浮动
数量:int

这个完成后,我们可以创建杂货类:

类食品(BaseModel):
地点:str
总:浮动
优惠券:浮动=没有
Giftcard:浮动=没有
用户:str
CreatedDate: str
TransactionDate: str
项目:列表(项)

注意到,“没有一个”价值可以被传递的JSON对象。现在我们可以创建端点。这将是相同的地址作为第一个杂货店端点,但将使用一个“后”,而不是“得到”。我们还需要发送一个杂货店字典。

@app.post (“/ receiptsapi / v1 /杂货”)
异步def AddGrocery(杂货:杂货):
杂货=等待storage.add_groceries (grocery.dict ())
返回杂货

接下来,我们将需要工作add_groceries()函数的存储。py文件。开始,我们将使用textbox筹集任何错误我们可能。我们还需要声明一个ObjectId为了从MongoDB插入和删除,所以我们需要增加两个进口后pymongo进口但在我们宣布pymongo客户:

从fastapi进口textbox
bson。objectid进口objectid

像其他FastAPI插入,我们需要一个在插入“try-except”,以及一个状态返回一个描述性的消息。我写了关于如何做我的一些其他博客。然而,因为pymongo使用JSON对象的不同,我们不需要把字典对象。我们可以简单地添加字典:

异步def add_groceries(食品):
试一试:
db.Grocery.insert(食品)
client.close ()
返回{“响应”:“用户插入:% s %(超市)}
除了例外e:
client.close ()
提高textbox (status_code = 404,细节= e)

测试部分,添加JSON对象你想插入的身体:

插入端点紧急

像杂货店插入、紧急类需要设置:

类紧急(BaseModel):
总:浮动
CreatedDate: str
TransactionDate: str
原因:str =没有

接下来,我们将添加的端点。

@app.post (“/ receiptsapi / v1 /紧急状态”)
异步def AddEmergency(紧急:紧急):
紧急情况=等待storage.add_emergencies (emergency.dict ())
返回紧急情况

现在端点设置app.py文件中,我们将转移到存储。py文件工作add_emergencies功能:

异步def add_emergencies(紧急):
试一试:
db.Emergency.insert(紧急)
client.close ()
返回{“响应”:“用户插入:% s %(紧急)}
除了例外e:
client.close ()
提高textbox (status_code = 404,细节= e)

接下来,简单的测试在邮递员。

插入端点为娱乐

设置娱乐集合时,有一个错误。项目列表不是标准与杂货项列表。这是一种力量和NoSQL的陷阱,标准化不是必需的。我们可以用不同的命名工作在这个项目类:

类EntertainItem (BaseModel):
名称:str
价格:浮动

现在我们可以添加娱乐类:

类娱乐(BaseModel):
地点:str
总:浮动
Giftcard:浮动=没有
折扣:浮动=没有
CreatedDate: str
TransactionDate: str
项目:列表(EntertainItem)

接下来,我们可以设置娱乐终端:

@app.post (“/ receiptsapi / v1 /娱乐”)
异步def AddEntertainment(娱乐:娱乐):
娱乐=等待storage.add_entertainments (entertainment.dict ())
返回娱乐

像以前一样,然后移动到存储。py文件清除add_entertainments函数:

异步def add_entertainments(娱乐):
试一试:
db.Entertainment.insert(娱乐)
client.close ()
返回{“响应”:“用户插入:% s %(娱乐)}
除了例外e:
client.close ()
提高textbox (status_code = 404,细节= e)

现在我们可以测试:

插入端点为保险

幸运的是,我们没有特殊情况收集,所以我们没有设置任何额外的类。我们可以侥幸的app.py文件之前:

类保险(BaseModel):
地点:str
总:浮动
CreatedDate: str
TransactionDate: str

在同一个文件中,我们添加了端点:

@app.post (“/ receiptsapi / v1 /保险”)
异步def AddInsurance(保险:保险):
保险=等待storage.add_insurance (insurance.dict ())
返回保险

接下来,移动到存储。py文件add_insurance功能:

异步def add_insurance(保险):
试一试:
db.Insurance.insert(保险)
client.close ()
返回{“响应”:“用户插入:% s %(保险)}
除了例外e:
client.close ()
提高textbox (status_code = 404,细节= e)

在邮递员:

插入端点出租

另一个简单的类,如没有特殊情况的类:

类租金(BaseModel):
总:浮动
最低:浮动=没有
附加:浮动=没有
CreatedDate: str
TransactionDate: str

现在到端点:

@app.post (“/ receiptsapi / v1 /租金”)
异步def AddRent(租金:租金):
租=等待storage.add_rent (rent.dict ())
返回租金

接下来,移动存储。py设置add_rent功能:

异步def add_rent(租金):
试一试:
db.Rent.insert(租)
client.close ()
返回{“响应”:“用户插入:% s %(租)}
除了例外e:
client.close ()
提高textbox (status_code = 404,细节= e)

邮递员的测试:

插入端点为公用事业

最后一个端点插入MongoDB。我们首先建立了我们班:

类实用程序(BaseModel):
类型:str
总:浮动
CreatedDate: str
WithdrawalDate: str

接下来,添加端点:

@app.post (“/ receiptsapi / v1 /实用程序”)
异步def AddUtility(效用:效用):
公用事业=等待storage.add_utilities (utility.dict ())
返回工具

现在去存储。py add_utilities函数:

异步def add_utilities(效用):
试一试:
db.Utility.insert(效用)
client.close ()
返回{“响应”:“用户插入:% s %(效用)}
除了例外e:
client.close ()
提高textbox (status_code = 404,细节= e)

最后,邮差进行测试:

删除端点杂货店

现在,我们学会了如何使用pymongo和FastAPI插入数据库,我们也可以学习如何删除。为此,我们需要知道生成的id。因为这是基本“得到”语句返回,我们知道不同文档的GUID。我们需要将该值传递给函数。使用删除,而不是“post”我们将使用“删除”。

@app.delete (“/ receiptsapi / v1 /食品/ {id}”)
异步def DeleteGrocery (id: str):
杂货=等待storage.remove_grocery (id)
返回杂货

在remove_grocery函数,我们将需要声明字符串Id作为ObjectId。使用delete_one函数后,所有其他结构的“try-except”将像插入:

异步def remove_grocery (groceryId):
试一试:
db.Grocery.delete_one ({" _id ": ObjectId (groceryId)})
client.close ()
返回{“响应”:“用户插入:% s % (groceryId)}
除了例外e:
client.close ()
提高textbox (status_code = 404,细节= e)

在邮递员,我们将需要发送的字符串版本Id。这返回结果:

删除端点紧急

成功删除端点,现在我们将转移到紧急端点:

@app.delete (“/ receiptsapi / v1 /紧急/ {id}”)
异步def DeleteEmergency (id: str):
紧急情况=等待storage.remove_emergency (id)
返回紧急情况

现在,我们转移到存储。py文件:

异步def remove_emergency (emergencyId):
试一试:
db.Emergency.delete_one ({" _id ": ObjectId (emergencyId)})
client.close ()
返回{“响应”:“用户插入:% s % (emergencyId)}
除了例外e:
client.close ()
提高textbox (status_code = 404,细节= e)

知道我们现在了解测试,使用“get”抓住最近被插入的Id,并使用它来删除:

删除端点为娱乐

再一次,这些任务会重复相似的变量名。所以,首先,我们在app.py工作文件:

@app.delete (“/ receiptsapi / v1 /娱乐/ {id}”)
异步def DeleteEntertainment (id: str):
娱乐=等待storage.remove_entertainment (id)
返回娱乐

接下来,我们搬到存储。py文件:

异步def remove_entertainment (entertainmentId):
试一试:
db.Entertainment.delete_one ({" _id ": ObjectId (entertainmentId)})
client.close ()
返回{“响应”:“用户插入:% s % (entertainmentId)}
除了例外e:
client.close ()
提高textbox (status_code = 404,细节= e)

现在,我们搬到邮递员:

删除端点为保险

完成了一半。设置DeleteInsurance端点app.py文件中的第一个:

@app.delete (“/ receiptsapi / v1 /保险/ {id}”)
异步def DeleteInsruance (id: str):
保险=等待storage.remove_insurance (id)
返回保险

现在我们做的存储。py部分:

异步def remove_insurance (insuranceId):
试一试:
db.Insurance.delete_one ({" _id ": ObjectId (insuranceId)})
client.close ()
返回{“响应”:“用户插入:% s % (insuranceId)}
除了例外e:
client.close ()
提高textbox (status_code = 404,细节= e)

现在邮差:

删除端点出租

我们几乎是在那里。现在,我们将设置删除端点租金:

@app.delete (“/ receiptsapi / v1 /出租/ {id}”)
异步def DeleteRent (id: str):
租=等待storage.remove_rent (id)
返回租金

你知道钻,移动到存储。py文件:

异步def remove_rent (rentId):
试一试:
db.Rent.delete_one ({" _id ": ObjectId (rentId)})
client.close ()
返回{“响应”:“用户插入:% s % (rentId)}
除了例外e:
client.close ()
提高textbox (status_code = 404,细节= e)

在邮递员:

删除端点的效用

在我们最后的端点。像其他人一样,开始在app.py文件:

@app.delete (" / receiptsapi / v1 /工具/ {id}”)
异步def DeleteUtility (id: str):
公用事业=等待storage.remove_utility (id)
返回工具

到存储和移动到最后一个部分。py文件:

异步def remove_utility (utilityId):
试一试:
db.Utility.delete_one ({" _id ": ObjectId (utilityId)})
client.close ()
返回{“响应”:“用户插入:% s % (utilityId)}
除了例外e:
client.close ()
提高textbox (status_code = 404,细节= e)

现在最后邮差测试:

结论

首先,我们学习了如何在MongoDB删除文档。我们决定不覆盖更新部分,作为FastAPI版本将是一个更复杂的嵌入式/嵌套文件。相反,我们节省下时间。

学习MongoDB部分之后,我们搬到设置FastAPI部分。首先,我们在插入。我们学会了使用pydantic像常规FastAPI应用程序,但没有建立一个对象的插入功能。相反,对象只是过去了。textbox,讨论在不同的我的博客,被用来捕捉任何错误。我也放弃了娱乐收集和阅读它不包括任何验证需求,pydantic不使用双打,而不是使用浮动。

插入后,我们搬到从数据库中删除。要做到这一点,我们必须得到一个Id值,还把它转换成一个ObjectId格式。我们还介绍了如何正确地传递id通过端点。

我们现在更近一步得到每月的预算项目安装。但是现在,我们仍然需要讨论如何更新现有文档。直到下一次,干杯!

|注册加入我的邮件列表在这里

- - -

- - -

Baidu
map