如何连接到 sqlite3 db 文件并在 fastapi 中获取内容?

use*_*_12 5 python python-3.x fastapi

我有一个 sqlite.db 文件,有 5 列和 1000 万行。我已经使用 fastapi 创建了一个 api,现在在其中一个 api 方法中我想连接到 sqlite.db 文件并根据某些条件(基于存在的列)获取内容。我主要会使用 SELECT 和 WHERE。

我怎样才能通过利用异步请求来做到这一点。我遇到过 Tortoise ORM,但我不知道如何正确使用它来获取结果。

from fastapi import FastAPI, UploadFile, File, Form
from fastapi.middleware.cors import CORSMiddleware

DATABASE_URL = "sqlite:///test.db"


@app.post("/test")
async def fetch_data(id: int):
    query = "SELECT * FROM tablename WHERE ID={}".format(str(id))

    # how can I fetch such query faster from 10 million records while taking advantage of async func
    return  results
Run Code Online (Sandbox Code Playgroud)

Yag*_*nci 15

你在这里遗漏了一点,定义一个函数async是不够的。您需要使用异步数据库驱动程序才能利用协程的优势。

Encode数据库库非常适合此目的。

pip install databases
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下命令安装所需的数据库驱动程序:

pip install databases[sqlite]
Run Code Online (Sandbox Code Playgroud)

就您而言,这应该会起到很好的作用。

from fastapi import FastAPI, UploadFile, File, Form
from fastapi.middleware.cors import CORSMiddleware
from databases import Database

database = Database("sqlite:///test.db")


@app.on_event("startup")
async def database_connect():
    await database.connect()


@app.on_event("shutdown")
async def database_disconnect():
    await database.disconnect()


@app.post("/test")
async def fetch_data(id: int):
    query = "SELECT * FROM tablename WHERE ID={}".format(str(id))
    results = await database.fetch_all(query=query)

    return  results
Run Code Online (Sandbox Code Playgroud)

  • 但是拥有协程不会使查询执行速度更快,但可扩展性更高。想象一下,您同时发送 3 个请求,每个请求返回 1000 万个项目。他们将归还它们,而无需等待对方。所以如果一个请求在1秒内返回。1 秒内也会返回 3 个请求。但并不会让1秒的查询变得更快。 (4认同)
  • 不,据我所知,即使是 ORM 也无法做到这一点 (2认同)