簡體   English   中英

Select 來自 SQLAlchemy declarative_base 定義的表

[英]Select from table defined by SQLAlchemy declarative_base

我正在研究 FastAPI 教程,我正在嘗試使用 SQLAlchemy+Alembic+ databases創建表。
在我的main.py ,我有:

from typing import List

import databases
import sqlalchemy
from fastapi import FastAPI
from pydantic import BaseModel
from sqlalchemy import Table

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

database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()

notes = sqlalchemy.Table(
    "note",
    metadata,
    sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True),
    sqlalchemy.Column("text", sqlalchemy.String),
    sqlalchemy.Column("completed", sqlalchemy.Boolean),
)

class Note2(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[Note2])
async def read_notes():
    query = notes.select()
    return await database.fetch_all(query)

這有效 - 我可以GET /notes/端點。 但是在具有端點的同一模塊中創建數據庫表看起來很新手,所以我決定制作models.py文件並在那里創建一個普通的 model ,如下所示:

import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Note(Base):
    __tablename__ = "note"

    id = sa.Column(sa.Integer, primary_key=True)
    text = sa.Column(sa.String)
    completed = sa.Column(sa.Boolean)

這里出現了一個問題 - 當我像這樣更改端點時:

from app_second.models import Note

@app.get("/notes/", response_model=List[Note2])
async def read_notes():
    query = Note().select()
    return await database.fetch_all(query)

我收到一個錯誤:

AttributeError: 'Note' object 沒有屬性 'select'

正如這里提到的 - declarative_base()只是Table + mapper的語法 shugar 。 但是以這種方式聲明的選擇/過濾/更新表的正確方法是什么?

您可以使用table屬性來訪問 table 方法,然后使用 database.fetch_all() 或類似的。 例如:

from sqlalchemy import select
    
...
skip = 0
limit = 100

query = (
    Note.__table__.select()
    .offset(skip)
    .limit(limit)
)
return await database.fetch_all(query)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM