您也可以将
FastAPI
encode/databases
与
FastAPI
一起
使用
,
以使用
async
和
连接到数据库
await
。
它兼容:
PostgreSQL的
的MySQL
SQLite的
在此示例中,我们将使用
SQLite
,因为它使用单个文件并且Python具有集成的支持。
因此,您可以复制此示例并按原样运行它。
稍后,对于您的生产应用程序,您可能想要使用
PostgreSQL之
类的数据库服务器
。
小费
您可以采用有关SQLAlchemy ORM(
SQL(关系)数据库
)
部分的想法
,例如使用实用程序函数独立于
FastAPI
代码
在数据库中执行操作
。
本部分不应用这些想法,等同于
Starlette中
的对应
思想
。
导入和设置
SQLAlchemy
导入
SQLAlchemy
。
创建一个
metadata
对象。
notes
使用
metadata
对象
创建表
。
from typing import List
import databases
import sqlalchemy
from fastapi import FastAPI
from pydantic import BaseModel
# SQLAlchemy specific code, as with any other app
DATABASE_URL = "sqlite:///./test.db"
# DATABASE_URL = "postgresql://user:password@postgresserver/db"
database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()
notes = sqlalchemy.Table(
"notes",
metadata,
sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True),
sqlalchemy.Column("text", sqlalchemy.String),
sqlalchemy.Column("completed", sqlalchemy.Boolean),
)
engine = sqlalchemy.create_engine(
DATABASE_URL, connect_args={"check_same_thread": False}
)
metadata.create_all(engine)
class NoteIn(BaseModel):
text: str
completed: bool
class Note(BaseModel):
id: int
text: str
completed: bool
app = FastAPI()
@app.on_event("startup")
async def startup():
await database.connect()
@app.on_event("shutdown")
async def shutdown():
await database.disconnect()
@app.get("/notes/", response_model=List[Note])
async def read_notes():
query = notes.select()
return await database.fetch_all(query)
@app.post("/notes/", response_model=Note)
async def create_note(note: NoteIn):
query = notes.insert().values(text=note.text, completed=note.completed)
last_record_id = await database.execute(query)
return {**note.dict(), "id": last_record_id}
小费
请注意,所有这些代码都是纯SQLAlchemy Core。
databases
在这里还没有做任何事情。
导入和设置
databases
导入
databases
。
创建一个
DATABASE_URL
。
创建一个
database
对象。
from typing import List
import databases
import sqlalchemy
from fastapi import FastAPI
from pydantic import BaseModel
# SQLAlchemy specific code, as with any other app
DATABASE_URL = "sqlite:///./test.db"
# DATAB